webForumDet fria alternativet

Rekursiv funktion med array i flera dimensioner

PHP

2 svar · 326 visningar · startad av GrodanBoll

Medlem sedan sep. 2001788 inlägg
Frågan#1

Tjena hej :)

Jag har fyllt en array med data innehållande en hierarkisk nivåsortering enligt:

$testarray = array (
	1 => array ( "id" => 100, "descr" => "etthundra", "parentId" => "root" ),
	2 => array ( "id" => 200, "descr" => "tvåhundra", "parentId" => "root" ),
	3 => array ( "id" => 300, "descr" => "trehundra", "parentId" => "root" ),
	4 => array ( "id" => 400, "descr" => "fyrahundra", "parentId" => "root" ),
	5 => array ( "id" => 210, "descr" => "tvåhundratio", "parentId" => "2" ),
	6 => array ( "id" => 211, "descr" => "tvåhundraelva", "parentId" => "5" ),
	7 => array ( "id" => 220, "descr" => "tvåhundratjugo", "parentId" => "2" ),
	8 => array ( "id" => 500, "descr" => "femhundra", "parentId" => "root" ),
	9 => array ( "id" => 212, "descr" => "tvåhundratolv", "parentId" => "5" ),
	11 => array ( "id" => 110, "descr" => "etthundratio", "parentId" => "1" ),
	10 => array ( "id" => 600, "descr" => "sexhundra", "parentId" => "root" )

);

Denna skulle jag vilja visa i rättordning och med ett schysst indrag för subnivåer enligt förljande funktion som jag har försökt snickra ihop:

function displayChildren ( $parent, $level, $array )
{
	/*
		The format of the array is as such:
		Array
		(
    		[0] => Array
				(
					[key01] => Value01
					[key02] => Value02
					[key03] => Value03
					[key04] => Value04
				)
		
			[1] => Array
				(
					[key01] => Value01
					[key02] => Value02
					[key03] => Value03
					[key04] => Value04
				)
		
			[2] => Array
			...
		);
	*/
	
	$arrTemp01 = array();
	$keyId = "parentId";
	
	
	
	// Retrive all children of $parent and put them in the temp arry $arrTemp01.
	
	for ( $i = 0; $i < count ( $array ); $i++ ) // Loop trough every main array element.
	{
		// In every sub array, check för the right value in the right key.
		
		if ( $array [$i][$keyId] == $parent )
		{
			$arrTemp01[$i] = $array [$i];
		
		}
	
	}
	
	
	
	// Display each child, if there where any children that is.
		
	foreach ( $arrTemp01 as $key => $value )
	{
		echo ( str_repeat ( "&nbsp;&nbsp;&nbsp;&nbsp;", $level ).$value['descr']." Current key: ".$key."<br />\n" );
		//echo "Current key: ".$key."<br />";
		
		// Call this function again 2 display this child's children.
						
		displayChildren ( $key, ($level+1), $array);
	
	}

	
}

Sen anropar jag funktionen med:

displayChildren ( "root", 0, $testarray );

Problemet är att jag inte ser subarrayen med det största indexvärdet (nr 11).
Varför är det så?

Sen har jag även en andra undran som jag är nyfiken på.
Om jag sätter en subarray med index '0' (noll) så fastnar loopen, varför är det någon skillnad?

Medlem sedan mars 20034 471 inlägg
#2

Jag är inte helt säker på att detta löser ditt problem men... en idé på vägen i alla fall:

function printArray(&$array, $indrag) {
  $incr = "     "; //tex
  foreach ($array as $ix => $value) {
    if (is_array($value)) {
      echo $indrag."$ix =><BR>";
      printArray($value, $incr.$indrag);
    }
    else {
      echo $indrag."$ix => $value<BR>";
    }
  }
}

//anrop
printArray($testArray, "");
Medlem sedan sep. 2001788 inlägg
#3

Tack, jag löste det med:

function displayChildren2 ( $parent, $level, $dataarray)
{
	$keyId = 'parentId';

	foreach ($dataarray as $key => $element)
	{
		if ($element[$keyId] == $parent)
		{
			echo ( str_repeat ( "&nbsp;&nbsp;&nbsp;&nbsp;", $level ).$element['descr']." Current key: ".$key."<br />\n" );
			
			displayChildren2($key, $level + 1, $dataarray);
		
		}
	
	}

}
294 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
162 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)