otrdiena, 2010. gada 17. augusts

Recursīva php funkcija "koka" veidošanai

Jebkurš ar programmēšanu kaut cik saistīts cilvēks kaut ko ir dzirdējis par rekursīvām funkcijām. Tad nu šeit ir piemērs, kā es to esmu realizējis iekš php. Nepretendēju uz absolūto patiesībi, tikai padalos ar pieredzi.


Uzdevuma uzstādījums: ir 3 dimensiju  masīvs;

$arr=


Array
(
[1] => Array
(
[id] => 1
[name] => raksti
[hasChilds] => Y
[childs] => 2
)

[2] => Array
(
[id] => 2
[name] => subRaksti
[hasChilds] => Y
[childs] => 3,4
)

[3] => Array
(
[id] => 3
[name] => subCat1
[hasChilds] => N
[childs] =>
)

[4] => Array
(
[id] => 4
[name] => ssCat
[hasChilds] => Y
[childs] => 5
)

[5] => Array
(
[id] => 5
[name] => next subCat
[hasChilds] => N
[childs] =>
)

[6] => Array
(
[id] => 6
[name] => tetstqwqwqwqw
[hasChilds] => N
[childs] =>
)

)


Vajadzīgais rezultāts: jāizveido hierarhisks masīvs, kur katram elementam, kam lauks 'hasChilds' == 'Y' ir lauks , kas satur masīvu, kurā ir visi child elementi u.t.t. . Citiem vārdiem rezultāts:


Array
(
[1] => Array
(
[id] => 1
[name] => raksti
[children] => Array
(
[2] => Array
(
[id] => 2
[name] => subRaksti
[children] => Array
(
[3] => Array
(
[id] => 3
[name] => subCat1
)

[4] => Array
(
[id] => 4
[name] => ssCat
[children] => Array
(
[5] => Array
(
[id] => 5
[name] => next subCat
)

)

)

)

)

)

)

[6] => Array
(
[id] => 6
[name] => tetstqwqwqwqw
)

)


Zemāk kods, kas ausgtāk aprakstīto dabon gatavu.

    function formArray(&$arr,&$c=1,&$max=0,$childsArr=0){
if($childsArr==0)
{
$max=count($arr);
while($c<=$max) {
$retArr[$c]['id']=$arr[$c]['id'];
$retArr[$c]['name']=$arr[$c]['name'];
if($arr[$c]['hasChilds']=='Y'){
$childs=explode(',', $arr[$c]['childs']);
$c++;
$b=$c-1;
$retArr[$b]['children']=$this->formArray($arr,$c,$max,$childs);
}
$c++;
}

}elseif($childsArr!=0)
{
foreach($childsArr as $key=>$val)
{
$retArr[$c]['id']=$arr[$c]['id'];
$retArr[$c]['name']=$arr[$c]['name'];
if($arr[$c]['hasChilds']=='Y'){
$childs=explode(',', $arr[$c]['childs']);
$c++;
$b=$c-1;
$retArr[$b]['children']=$this->formArray($arr,$c,$max,$childs);
}
$c++;
}

}
$c--;
return($retArr);
}

Ja ir vajadzīgi paskaidrojumi, sakait to komentāros.

2 komentāri:

  1. Sveiks, šķiet, ka man izdevās īsāk un pat nedaudz rekursīvāk :)
    http://paste.php.lv/0eba711be36b5793217573c4534c3da2?lang=php

    AtbildētDzēst
  2. Man gan liekas, ka mans variants būs ātrāks.

    AtbildētDzēst