|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2001-12-19 14:46 UTC] TheWizardRK at yahoo dot com
I have a tree, which is loaded into a variable into the following (hopefully self-explanatory) structure:
Array(
[1] => Array ( [parentid] => 0, [name] => 1 )
[2] => Array ( [parentid] => 0, [name] => 2 )
[3] => Array ( [parentid] => 1, [name] => 1_1 )
[4] => Array ( [parentid] => 3, [name] => 1_1_1 )
[5] => Array ( [parentid] => 3, [name] => 1_1_2 )
[6] => Array ( [parentid] => 4, [name] => 1_1_1_1 )
[7] => Array ( [parentid] => 1, [name] => 1_2 )
[8] => Array ( [parentid] => 7, [name] => 1_2_1 )
[9] => Array ( [parentid] => 2, [name] => 2_1 )
)
This results in the following three:
+ 1
+ 1_1
+ 1_1_1
+ 1_1_1_1
+ 1_1_2
+ 1_2
+ 1_2_1
+ 2
+ 2_1
I have the following recursive function to draw this tree:
function funktzia($base,$dir)
{
foreach($dir as $id => $item)
{
if ($item[parentid]==$base)
{
echo "<UL>\n<LI>".$item[name]."</LI><BR>\n";
funktzia($id,$dir);
echo "</UL>\n";
}
}
}
where `$base' is the current tree node id, and `$dir' is the variable which holds the tree, as described above.
The function is initially called "funktzia(0,$tree);", and the recursively calls itself.
So far so good.
But if the `$dir' variable is a by-reference parameter (i.e. "[...] &$dir [...]" instead of "[...] $dir [...]" as now), or it is defined global within the function instead of being passed as a parameter (in either way, all recursion level use the same variable) - it doesn't work.
It draw the tree only while going up levels, but stop when it's time to go back to a lower level. Or in short, the following tree is drawn instead of the full one:
+ 1
+ 1_1
+ 1_1_1
+ 1_1_1_1
It seems that when we go back to the lower "foreach" loop, the array pointer it uses already points to the end of the array (since we just finished doing a "foreach" loop on that array in the higher level).
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Nov 02 09:00:01 2025 UTC |
$tree = Array( [1] => Array ( [parentid] => 0, [name] => '1' ) [2] => Array ( [parentid] => 0, [name] => '2' ) [3] => Array ( [parentid] => 1, [name] => '1_1' ) [4] => Array ( [parentid] => 3, [name] => '1_1_1' ) [5] => Array ( [parentid] => 3, [name] => '1_1_2' ) [6] => Array ( [parentid] => 4, [name] => '1_1_1_1' ) [7] => Array ( [parentid] => 1, [name] => '1_2' ) [8] => Array ( [parentid] => 7, [name] => '1_2_1' ) [9] => Array ( [parentid] => 2, [name] => '2_1' ) ); // Recursion using a copy of the variable each time // WORKS function funktzia1($base,$dir) { foreach($dir as $id => $item) { if ($item[parentid]==$base) { echo "<UL>\n<LI>".$item[name]."</LI><BR>\n"; funktzia1($id,$dir); echo "</UL>\n"; } } } // Print the tree using the first function funktzia1(0,$tree); // Recursion using the same variable - pass by reference (note the "&" before the "$dir") // DOESN'T WORK function funktzia2($base,&$dir) { foreach($dir as $id => $item) { if ($item[parentid]==$base) { echo "<UL>\n<LI>".$item[name]."</LI><BR>\n"; funktzia2($id,$dir); echo "</UL>\n"; } } } // Print the tree using the second function funktzia2(0,$tree);