Tema: Re: rekursija
Autorius: Aibo
Data: 2010-03-01 19:19:12
Jei mano tūpa galva priimena, tai šitas ciklas per 6000 įrašų
atveju padaro 18003000 iteracijų,
o per 12000 - 72006000

Tai gaunasi, kad ~4 kartus ilgiau jį vykdys...
Matyt set_time_limit() reikia daryti didelį.


Gal greitesnis variantas būtų iš pradžių pasidarius masyvą tokį:
$parents = array();
foreach($data as $d)
{
	$parents[$d['parent_id']][$d['id']] = $d;
}

o tada jau

function get_child($parents, $pid)
{
	$tree = array();	
	foreach($parents[$pid] as $id => $d)
	{
	        $tree[$d['id']] = $d;
		if (isset($parents[$id]))
		{
			$tree[$d['id']]['children'] = $this->get_child($parents, $id);
		}
	}
}

matyt yra dar paprastesnis variantas, sito kur parasiau netstavau, gali  
buti klaidu





On Fri, 26 Feb 2010 19:02:42 +0200, bk <a@a.com> wrote:

> sveiki,
>
> padariau savo pirmaja rekursija, kuri formuoja multidimensional  
> masyva.veikti tai lyg viskas veikia, ale pvz 6000 irasu suka ~20  
> sekundziu, o 12000 - isvis nesulaukiau...
> taigi, kas negerai su sia funckija? slieku savo jegomis daugiau nerandu,  
> bo neesu itin geras egzpertas :)
>
> <?
> function get_child($data, $pid = null) {
>   $tree = array();
>  foreach( $data as $key => $d ) {
>         if( $d['parent_id'] == $pid ) {
>        $tree[$d['id']] = array
>                                     (
>                                      'parent_id' => $d['parent_id']
>                                     );
>        unset($data[$key]);
>        $children =  $this->get_child($data, $d['id']);
>        if($children) {
>             $tree[$d['id']]['children'] = $children;
>        }
>   }
>   }
>   return $tree;
>  }
> ?>


-- 
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/