Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
array umsortieren [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
array umsortieren


 
marc75
22-07-2005, 10:34 
 
Hallo Leute,

ich bräuchte mal eine Idee wie ich ein array am besten umsortieren kann.

Ursprungsarray

Array
(
[0] => Array
(
[id] => 1
[titel] => Grosseltern
[parent] => 0
[test] => 0
)

[1] => Array
(
[id] => 3
[titel] => Nachbarn
[parent] => 0
[test] => 1
)

[2] => Array
(
[id] => 10
[titel] => Sonstige deppen
[parent] => 0
[test] => 2
)

[3] => Array
(
[id] => 4
[titel] => schmidt
[parent] => 3
[test] => 0
)

[4] => Array
(
[id] => 5
[titel] => Müller
[parent] => 3
[test] => 1
)

[5] => Array
(
[id] => 8
[titel] => meyer
[parent] => 3
[test] => 2
)

[6] => Array
(
[id] => 7
[titel] => Schmidts Kind
[parent] => 4
[test] => 0
)

)




Zielarray

Array
(
[0] => Array
(
[id] => 1
[titel] => Grosseltern
[parent] => 0
[test] => 0
)

[1] => Array
(
[id] => 3
[titel] => Nachbarn
[parent] => 0
[test] => 1
)

[2] => Array
(
[id] => 4
[titel] => schmidt
[parent] => 3
[test] => 0
)

[3] => Array
(
[id] => 7
[titel] => Schmidts Kind
[parent] => 4
[test] => 0
)

[4] => Array
(
[id] => 5
[titel] => Müller
[parent] => 3
[test] => 1
)

[5] => Array
(
[id] => 8
[titel] => meyer
[parent] => 3
[test] => 2
)

[6] => Array
(
[id] => 10
[titel] => Sonstige deppen
[parent] => 0
[test] => 2
)


)




Grosseltern |ID 1 | Parent 0
Nachbarn |ID 3 | Parent 0
|- Schmidt |ID 4 | Parent 3
|-- Schmidts Kind |ID 7 | Parent 4
|- Müller |ID 5 | Parent 3
|- Meyer |ID 8 | Parent 3
Sonstige Deppen |ID 10| Parent 0


Sortiert müsste nach parent und id werden, zum Beispiel wenn parent 3 ist dann müssen die arrays nach ID 3 folgen. Am Ende sollte ein Menü daraus werden.

Zusammengebaut wird das Array mit einer Funktion die sich immer wieder selbst aufruft bis sie parent 0 erreicht.

Jetzt bräuchte ich nur noch eine Idee wie ich das array umsortieren kann.

 
onemorenerd
22-07-2005, 10:39 
 
Die Array-Sortierfunktionen aus dem Manual sind dir sicherlich bekannt. Also frag ich mal dezent, warum nicht einfach ...

foreach ($array as $key => $subarray) {
$newarray[$subarray['id']] = array(
'titel' => $subarray['titel'],
'parent' => $subarray['parent'],
'test' => $subarray['test']
);
}
print_r($newarray);

... und ggf. noch sortieren?

 
marc75
22-07-2005, 11:57 
 
Die php-Sortierfunktionen sind mir bekannt, bzw. hab ich die gestern schon durchgesehen.

Hab mir deine foreach() auch angesehen, aber kann da irgendwie den nutzen nicht erkennen, ausser das das array durchlaufen wird und die indizes mit den IDs ersetzt werden.

Entweder sollte ich heute was anderes machen, oder ich kann einfach nicht erkennen wie ich das array 'schmidts kind' zwischen 'schmidt' und 'müller' schieben kann usw..

 
onemorenerd
22-07-2005, 13:13 
 
Wollte nur darauf hinweisen, dass dein Primärindex völlig sinnfrei ist, während der eigentliche Sinn in den IDs steckt.
Nach der obigen foreach-Schleife hast du folgende Struktur:

Array
(
...
[4] => Array
(
[titel] => schmidt
[parent] => 3
[test] => 0
)
[5] => Array
(
[titel] => Müller
[parent] => 3
[test] => 1
)
[7] => Array
(
[titel] => Schmidts Kind
[parent] => 4
[test] => 0
)
...
)

Deine Sortierung (Verschachtelung) kannst du nun mit folgendem Code zaubern.

foreach ($newarray as $key => $subarray) {
// wenn es ein Parent fürs aktuelle Element gibt
if (isset($newarray[$subarray['parent']])) {
// speichere das Element innerhalb seines Parents
$newarray[$subarray['parent']][$key] = $subarray;
// und lösche das Originalelement
unset($newarray[$key]);
}
}

Sollte folgendes liefern:

Array
(
...
[4] => Array
(
[titel] => schmidt
[parent] => 3
[test] => 0
[7] => Array
(
[titel] => Schmidts Kind
[parent] => 4
[test] => 0
)
)
[5] => Array
(
[titel] => Müller
[parent] => 3
[test] => 1
)
...
)

Ganz ähnlich geht es natürlich auch ohne die Vorbehandlung. Allerdings funktioniert das so nur für einfache Verschachtelung. Wenn "Schmidts Kind" selbst noch Kinder haben kann, mußt du was rekursives bauen.
Seh grad, dass Schmidt, Schmidts Kind und Müller ja alles Kinder von Nachbarn sind. Also vergiß das Zeug da oben. Du brauchst was rekursives.

 
prego
22-07-2005, 13:19 
 
such mal in den codeschnipseln nach array_multisort... oder nur multisort. MrHappiness hatte da mal was gepostet.

 
marc75
22-07-2005, 14:35 
 
Ich glaube ich muss nochmal über der Funktion grübeln, womit ich das array erzeuge, dann kann ich mir das anschliessende umsortieren sparen, was dann sicherlich performanter ist.


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:27 Uhr.