2016-07-22 30 views
0

Ich versuche eine Navigationsmenü-Liste zu sortieren, die mir zur Verfügung gestellt wird (als $ -Antwort in einem Array). Es wäre also parent_id (null ist das oberste Tier nav.), Dann würden die Unterseiten unter die Eltern-IDs fallen, was page_id dann in der page_order wäre. Grundsätzlich in der Reihenfolge, in der Sie die Nav sehen würden. Menü auf einer Website.Sortiere stdClass nach parent_id, parent_id ~> page_id, dann page_order

Zum Beispiel:

First Nav 
--First Nav Sub Page 1 
--First Nav Sub Page 2 
--First Nav Sub Page 3 
--First Nav Sub Page 4 
--First Nav Sub Page 5 
Second Nav 
Third Nav 
--Third Nav Sub Page 1 
--Third Nav Sub Page 2 
Fourth Nav 

Das Array:

Array (
[0] => stdClass Object 
    (
     [page_id] => 122021 
     [title] => First Nav 
     [page_order] => 1 
     [parent_id] => null 
    ) 

[1] => stdClass Object 
    (
     [page_id] => 99122 
     [title] => Second Nav 
     [page_order] => 2 
     [parent_id] => null 
    ) 

[2] => stdClass Object 
    (
     [page_id] => 260447 
     [title] => Third Nav 
     [page_order] => 3 
     [parent_id] => null 
    ) 

[3] => stdClass Object 
    (
     [page_id] => 170627 
     [title] => Fourth Nav 
     [page_order] => 4 
     [parent_id] => null 
    ) 

[4] => stdClass Object 
    (
     [page_id] => 134788 
     [title] => Third Nav Sub Page 1 
     [page_order] => 1 
     [parent_id] => 260447 
    ) 

[5] => stdClass Object 
    (
     [page_id] => 157074 
     [title] => Third Nav Sub Page 2 
     [page_order] => 2 
     [parent_id] => 260447 
    ) 

[6] => stdClass Object 
    (
     [page_id] => 699423 
     [title] => First Nav Sub Page 1 
     [page_order] => 1 
     [parent_id] => 122021 
    ) 

[7] => stdClass Object 
    (
     [page_id] => 346209 
     [title] => First Nav Sub Page 2 
     [page_order] => 2 
     [parent_id] => 122021 
    ) 

[8] => stdClass Object 
    (
     [page_id] => 732773 
     [title] => First Nav Sub Page 3 
     [page_order] => 3 
     [parent_id] => 122021 
    ) 

[9] => stdClass Object 
    (
     [page_id] => 164338 
     [title] => First Nav Sub Page 4 
     [page_order] => 4 
     [parent_id] => 122021 
    ) 

[10] => stdClass Object 
    (
     [page_id] => 671117 
     [title] => First Nav Sub Page 5 
     [page_order] => 5 
     [parent_id] => 122021 
    ) 
) 

ich es geschafft haben, diese in einem Teilauftrag zu bekommen, von parent_id dann page_order (wie oben in der Anordnung gezeigt) unter Verwendung des ArrSort Funktion, die unten notiert ist, aber ich war nicht in der Lage, die Unterseiten page_order 'unterhalb' ihrer parent_id zu setzen.

Ich habe versucht:

function ArrSort ($Array){ 
    $parent_id = array(); 
    $page_order = array(); 
    foreach($Array as $key => $value){ 
     $parent_id[] = $value->parent_id; 
     $page_order[] = $value->page_order; 
    } 
    array_multisort($parent_id, SORT_ASC, $page_order, SORT_ASC, $Array); 
    return $Array; 
} 
$sorted_pages_array = ArrSort($response); 

Ich habe auch die folgende versucht,

Und eine Kombination aus beidem:

$sorted_pages_array = ArrSort($response); 
usort($sorted_pages_array, "PageList"); 

Leider bin ich nicht so vertraut mit Arrays und sortieren, und könnte etwas Hilfe gebrauchen.

Antwort

0

Nachdem einige graben, fand ich diese: https://stackoverflow.com/a/8021033/3925032

Also, mit der Ausnahme der folgenden Änderung der oben verlinkten Lösung:

$node['object']->id-$node['object']->page_id

$node['object']->top_id-$node['object']->parent_id

$node['object']->name bis $node['object']->title

(und ein paar meiner eigenen Updates hinzufügen), das war, was ich gesucht habe. Und als ich es nach der Funktion ArrSort (in meiner ursprünglichen Frage) hinzugefügt habe, war alles gut!

0

Versuchen Sie folgendes:

usort($sorted_pages_array, function($a, $b){ 
    if($a->parent_id === $b->parent_id && $a->page_id === $b->page_id){ 
     return $a->page_order - $b->page_order; 
    } 
    elseif($a->parent_id === $b->parent_id){ 
     return $a->page_id - $b->page_id; 
    } else { 
     return $a->parent_id - $b->parent_id; 
    } 
}); 

Es wäre wahrscheinlich einfacher sein, zuerst Ihre Daten in der Datenbank zu sortieren.

+0

Dies funktioniert nicht. Es legt nicht nur die parent_id 'null' an erster Stelle, sondern auch die Seite_order ist nicht in der richtigen Reihenfolge. Tatsächlich kann ich in den Ergebnissen keine Reihenfolge sehen, die tatsächlich "schlechter" ist als meine ArrSort-Funktion. –