Mehrdimensionales Array rekursiv sortieren

So, da von dir das Ding nicht formatiert kommt owhl ich dir geschrieben habe wie, habe ich mich halt mal hingesetzt und in Mühsammer Handarbeit das DIng formatiert, damit man es lesen kann

Code:
array(5) {
	
	[0]=> array(4) { 
		["menuindex"]=> string(1) "3" 
		["parentindex"]=> string(1) "0" 
		["title"]=> string(19) "Bekleidung & schuhe" 
		["ebene"]=> string(1) "1" 
	} 
	[1]=> array(4) { 
		["menuindex"]=> string(2) "27" 
		["parentindex"]=> string(1) "3" 
		["title"]=> string(25) "Autoradio mit LCD Anzeige" 
		["ebene"]=> string(1) "2" 
	} 
	[2]=> array(4) { 
		["menuindex"]=> string(1) "5" 
		["parentindex"]=> string(1) "3" 
		["title"]=> string(8) "Bademode" 
		["ebene"]=> string(1) "2" 
	} 
	[3]=> array(4) { 
		["menuindex"]=> string(2) "25" 
		["parentindex"]=> string(1) "5" 
		["title"]=> string(22) "Autoradio mit Laufwerk" 
		["ebene"]=> string(1) "3" 
	} 
	[4]=> array(4) { 
		["menuindex"]=> string(2) "26" 
		["parentindex"]=> string(2) "25" 
		["title"]=> string(24) "Autoradio mit Chipkarten" 
		["ebene"]=> string(1) "4" 
	} 
	[5]=> array(4) { 
		["menuindex"]=> string(1) "4" 
		["parentindex"]=> string(2) "27" 
		["title"]=> string(16) "Hosen mit Falten" 
		["ebene"]=> string(1) "3" 
	}

Also, du willst damit ein Baum zusammensetzen. Nach menüindex 3 kommen alle mit parentindex 3. Das ganez x-Fach vertieft (ebenen). So weit so gut.

Eine möglichkeit währe mit einem array_filter zuerst mal alle auslesen die de ebene 1 haben um mal die Masters zu haben.
Dann kannst du iterativ den ganzen Baum auslesen und neu zusammensetzen.

Da aber diese Daten in einer Tabelle drin hast, habe ich dir etwas, damit du es gleich in der DB schon machen kannst. Dazu habe ich vor geraumer Zeit mal einige Besipiele zusammengesetzt:
MySQL Hierarchie Baum auslesen -> Das Beispiel 3 ist genau das was du willst
 
Hallo yaslaw!

Was sagst Du zu folgender Lösung? Die Lösung ist rein php basierent und bisher habe ich keine Fehler gefunden. Bis jetzt funktioniert es ganz gut. Ich hoffe, ich habe alles gut auskommentiert.

Das einzigste, was noch an Vorarbeit bei dem ganzen zu machen war, ist eine Aufsplittung des Hauptarrays in ein "mainarray". In dem alle Datensätze mit dem "parentindex" 0 enthalten sind und einem "helparray", in dem alle Datensätze mit dem "parentindex" größer 0 enthalten sind.


PHP:
// durchlaufen des wurzelblockes
// bis der hilfsblock komplett gelehrt ist
while(count($helparray) > 0) {
$position=0;
foreach($mainarray as $key1 => $einnsortblock)
	{
	$plusposition=0;
	// ermitteln der gesamtanzahl im alten und neuen (erweiterten) arrayblock
	$mainarraycount=count($mainarray);
	// einlesen des hilfsblocks mit menuindex (hauptblock) und dazu passende datensaetze aus dem hilfsblock (parentindex)
	foreach($helparray as $key2 => $aussortblock)
		{
		if($aussortblock['1'] == $einnsortblock['0'])
			{
			// erfassen der verglichenen datensaetze in einem zweiten hilfsarray mit gleichzeitigem loeschen aus ersten hilfsblock
			$einnsortblockneu[]=$aussortblock;
			unset($helparray[$key2]);
			}
		}
		// weitere datenbearbeitung nur wenn im zweiten hilfsarray datensaetze vorhanden sind
		if(count($einnsortblockneu) > 0)
			{			
			// verschiebungsbereich des schleifenzeigers
			$plusposition=count($einnsortblockneu);
			
			// ermitteln des abzuschneiden bereiches im array fuer das anfuegen der datensaetze
			// ist der bereich kleiner wird das array aufgebrochen, der neue teil an den bestehenden angefuehgt und der
			// alte wird wieder angehangen.
			// ist es das ende des array, werden die daten nur angehangen.
			$arraydifferenz=(($mainarraycount-$position-1)*-1);
			if($arraydifferenz < 0)
				{
					$mainarrayhaupt=array_splice($mainarray,$arraydifferenz);
					$mainarray=array_merge($mainarray,$einnsortblockneu,$mainarrayhaupt);
				}
				else
				{
					$mainarray=array_merge($mainarray,$einnsortblockneu);
				}
			}
			
	// leeren des zweiten hilfsblockes und positionsverschiebung des schleifen internen zaehlers
	$einnsortblockneu=array();
	$position=$position+1+$plusposition;
	}
}
 
Zurück