Jump to content
php.lv forumi

Rekursīva array izveide


Pieduriens

Recommended Posts

Šodien sapratu ka manam menu ir nepieciešama arī itemu dzēšanas opcija :))

Iekš CodeIgniter mēģinu izveidot  funkciju. Nepieciešams array kurš tiku padots uz db dzēšanai.

$selected_items_by_id = array('1','2','3','4',); // --<<<Nepieciešams izveidot šo.
$this->db->where_in('id', $selected_items_by_id);
$this->db->delete('mytable');

( Šajā piemērā rādu ka esmu ielicis iekš array Item1 un visus tā subus. )

 

mytable DB struktūra:

ID | NAME | PARENT_ID
1    Item1      0      // Pirmais Root items
2    Item2      1      // Pirmais Root sub items
3    Item3      2      // Pirmais Root sub sub items
4    Item4      3      // Pirmais Root sub sub sub items
5    Item5      0      // Otrais Root items


Struktūra

Item1
+Item2
++Item3
+++Item4
Item5

 

Šādi es saņemu id no input formas:

$id = $this->input->post('delete_menu_item');
Loģika:
  1. Ja itema parent_id ==0, tad tas ir root items.
  2. Ja items ir roots, tad iekš array būt tikai roota id.
  3. Iekš array jāieliek itema id un visi sub id ( ja tādi ir)

Saprotu, ka te atkal darbs rekursīvai funkcijai, taču šādas funkcijas izveide vēl sagādā galvassāpes.

Paldies.

Edited by Pieduriens
Link to comment
Share on other sites

Jau iepriekšējā topikā es tev iemetu darbojošu funkciju, kas uzbūvē šādu koku. Lai saprastu rekursiju, tev vispirms jāsaprot rekursija.

Nu rekursīvs piemērs varētu būt šāds:

<?php
$var = 0;
function recursive($var){
    
    if ($var == 10){
        
        echo 'Merkis sasniegts: $var tagat ir: '.$var;
    } 
    else{
        $var++;
        echo $var.'. rinkis<br>';
        recursive($var);
    }
}

recursive($var);
?>
Link to comment
Share on other sites

Pēc dienas mocīšanās izskatās ka te vienkārši ar rekursīvu funkciju nebūs nekas līdzēts.

http://pastebin.com/ZjY2Bcgk

 

Loģikā neizprotu to, kā iestāstīt ka Itemam1 var būt arī subi. Vienīgais atslēgas posms ir parent_id , kurš ja ir == 0 norāda tikai to ka tas ir root items. Bet Rootam jau var būt subi. Nepietiekama struktūra DB? 

Skatoties pastebin function search atdala izvēlēto itemu atseviškā array. Funkcija build_array meiģina veidot array.

Ieteikumi?

Link to comment
Share on other sites

Ko tu gribi panākt? Izdzēšot parentu izdzēst arī childus? Ja tā, tad tas visvienkāršāk realizējams ar foreign key uz itemu kur parent_id ir foreign key uz tās pašas tabulas id ar null parent_id root elementam, on delete cascade vai ja tev ir kaut cik advancēts ORM (izskatās, ka nē) - ar modeļu on_delete eventu izdzēs chaildus caur modeļiem un tā līdz bezgalībai.

Link to comment
Share on other sites

Ko tu gribi panākt? Izdzēšot parentu izdzēst arī childus? Ja tā, tad tas visvienkāršāk realizējams ar foreign key uz itemu kur parent_id ir foreign key uz tās pašas tabulas id ar null parent_id root elementam, on delete cascade vai ja tev ir kaut cik advancēts ORM (izskatās, ka nē) - ar modeļu on_delete eventu izdzēs chaildus caur modeļiem un tā līdz bezgalībai.

Jā, izdzēšot vērtīgāku itemu izdzēš arī nevērtīgākus ( childus ). Par foreign key nebiju iedomājies.

Izmantoju CodeIgniter.

 

Sapratu, ka par 100% nemāku nodefinēt savu problēmu. Laikam jācitē šis:

 

 

"Manuprāt, tev ar steigu ir jāizlasa grāmatas (kaut vai daiļliteratūra) 10 000 lapaspušu apmēra un pēc tam jāuzraksta 50 esejas, lai tu iemācītos formulēt savu domu. Lasot tu apgūsi izteiksmes paternus, bet rakstot iemācīsies tos pielietot." (Codez)
Edited by Pieduriens
Link to comment
Share on other sites

1. Tabulu dzinējiem jābūt InnoDB

2. Itkā vajadzētu ļaut. PHPmyadmin nelietoju. Nezinu. Meklē manuālī.

1. Man ir tikai viena tabula priekš navigation. ( InnoDB).  

2. Cik saprotu, šeit runa ir tikai par pareizo indexu salikšanu.

 

Kāda būtu ši izteiksme @ sql?:  

visvienkāršāk realizējams ar foreign key uz itemu kur parent_id ir foreign key uz tās pašas tabulas id ar null parent_id root elementam, on delete cascade 

 

Edited by Pieduriens
Link to comment
Share on other sites

Paldies par F3llony ieteikumiem :)))

Jūtos laimīgs! 

 

Gala rezultāts:

CREATE TABLE `navigation` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(50) NOT NULL COLLATE 'utf8_general_ci',
	`url` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
	`position` MEDIUMINT(8) NOT NULL DEFAULT '100',
	`parent_id` INT(11) NOT NULL,
	PRIMARY KEY (`id`),
	INDEX `parent_id` (`parent_id`),
	CONSTRAINT `FK1` FOREIGN KEY (`parent_id`) REFERENCES `navigation` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;
Edited by Pieduriens
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...