2009-01-05 4 views
5

Im Prinzip habe ich ein Setup wie folgt aus:eine Anordnung eines Arrays von Objekten in PHP von Schlüsselwert Sortierung

Array ( 
[0] => Array ([0] => stdClass Object ([nid] => 1 [title] => title1 [uid] => 1 [parent] => 0 [weight] => -15 [name] => name1 [value] => 0) 
       [1] => stdClass Object ([nid] => 2 [title] => title2 [uid] => 1 [parent] => 0 [weight] => -7 [name] => name2 [value] => 100) 
       [2] => stdClass Object ([nid] => 3 [title] => title3 [uid] => 2 [parent] => 0 [weight] => -1 [name] => name3 [value] => 0) 
       [3] => stdClass Object ([nid] => 4 [title] => title4 [uid] => 2 [parent] => 0 [weight] => 1 [name] => name4 [value] => 80) 
      ) 
) 

Was ich brauche, ist ein Weg, um alle Felder innerhalb des übergeordneten Array zu sortieren, indem Sie die [ Wert] im Objekt eingeben. Ich habe es seit ungefähr 2 Tagen mit Usort und verschiedenen Methoden versucht, aber ich kann es einfach nicht verstehen. Die [value] -Taste liegt irgendwo zwischen 0 und 100 und ich brauche alle Arrays in absteigender Reihenfolge (IE: 100 bis 0).

Antwort

0

Ich könnte falsch liegen, aber ich glaube, ich habe etwas mit asort() (oder asort()) getan. Es war in einer Suchfunktion, wo ich ein zweidimensionales Array mit Indizes und Zeitstempeln sortieren musste.

Ich bin nicht sicher, ob es in Ihrem Fall funktioniert, und ich habe es vor langer Zeit getan. Vielleicht bekommst du es aber, viel Glück.

13

Verwendung usort:

function cmp($a, $b) { 
    if ($a->value == $b->value) { 
    return 0; 
    } else { 
    return $a->value < $b->value ? 1 : -1; // reverse order 
    } 
} 

usort($arr, 'cmp'); 
+1

In der else-Klausel, ersetzen Sie einfach die erste: mit einem? Rückgabe $ a-> Wert < $b-> Wert?1: -1; // umgekehrte Reihenfolge – Jrgns

1
function cmp($a, $b) { 
    return $b->value - $a->value; 
} 

$ary[0] = usort($ary[0], "cmp"); 

Um ein Array zu sortieren, basierend auf etwas anderes als einfachen Wert oder Schlüssel, müssen Sie die usort Funktion nutzen und Ihren eigenen Vergleich zu liefern. Vergleichsfunktionen müssen so definiert sein, dass, wenn $a vor $b vorkommt, ein positiver Wert zurückgegeben wird und ein negativer, wenn $b vor $a steht (oder Null, wenn sie gleich sind). Da Sie auf der Grundlage von Zahlenwerten vergleichen und eine umgekehrte Sortierung wünschen, besteht die einfachste Möglichkeit darin, den Wert $a vom Wert $b zu subtrahieren.

3

Eine Möglichkeit besteht darin, das Wertearray vom Array von Objekten zu trennen und somit zwei Arrays zu erstellen. Sie können dann array_multisort verwenden, um das Array von Objekten nach dem anderen Array zu sortieren. Hier ein Beispiel:

<?php 
$array1 = $objectvalues 
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4); 
array_multisort($array1, $array2); 
?> 

Sie ein foreach-Schleife das Array einer Zeit und ein neues Array mit der entsprechenden [Wert] -Taste verwenden:

<?php 
foreach($arraywithobjects as $obj) 
{ 
    $objectvalues[] = $obj->getValue(); 
} 
?> 

Dies wird den Objektwert erhalten und Einsatz es in ein anderes Array, das Sie mit dem Multisort verwenden können.

Am Ende des Code wird wie folgt aussehen:

<?php 
foreach($arraywithobjects as $obj) 
{ 
    $objectvalues[] = $obj->getValue(); 
} 
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4); 
array_multisort($objectvalues, $array2); 
?> 

Das erste Feld in dem array_multisort Feld das Array sein sollten Sie das zweite Array zu sortieren verwenden.

Sie können auch eine andere Sortiermethode hinzufügen. Sie können sie hier lesen: link text

+0

Ich ging für diesen Ansatz, danke! –

4

100% von der ersten Antwort auf dieser Seite gestohlen. http://us.php.net/manual/en/function.array-multisort.php
Aber das ist, was ich gesucht habe.

Multisort ein Array von Objekten:

example object [$object with array of objects]: (class: test) 
---------------------------------- 

test Object (
    [Artikel] => Array (
     [0] => test Object (
      [id] => 1 
      [title] => CCCC 
     ) 
     [1] => test Object (
      [id] => 2 
      [title] => AAAA 
     ) 
     [2] => test Object (
      [id] => 3 
      [title] => DDDD 
     ) 
     [3] => test Object (
      [id] => 4 
      [title] => BBBB 
     ) 
    ) 
) 

---------------------------------- 

Simple PHP function: sort_arr_of_obj() 

<?php 
// -------------------------------------- 

/* 
* -------- function arguments -------- 
* $array ........ array of objects 
* $sortby ....... the object-key to sort by 
* $direction ... 'asc' = ascending 
* -------- 
*/ 

function sort_arr_of_obj($array, $sortby, $direction='asc') { 

    $sortedArr = array(); 
    $tmp_Array = array(); 

    foreach($array as $k => $v) { 
     $tmp_Array[] = strtolower($v->$sortby); 
    } 

    if($direction=='asc'){ 
     asort($tmp_Array); 
    }else{ 
     arsort($tmp_Array); 
    } 

    foreach($tmp_Array as $k=>$tmp){ 
     $sortedArr[] = $array[$k]; 
    } 

    return $sortedArr; 

} 


// -------------------------------------- 
?> 

example call: 
---------------------------------- 

<?php 

$sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc'); 

?> 

example result: $sorted (class: test) 
---------------------------------- 

test Object (
    [Artikel] => Array (
     [0] => test Object (
      [id] => 2 
      [title] => AAAA 
     ) 
     [1] => test Object (
      [id] => 4 
      [title] => BBBB 
     ) 
     [2] => test Object (
      [id] => 1 
      [title] => CCCC 
     ) 
     [3] => test Object (
      [id] => 3 
      [title] => DDDD 
     ) 

    ) 
) 
+1

Vielen Dank für diese – Ponce

+1

Gerade stieß auf diese Lösung. Funktioniert auch für mich! Danke :) Ich musste es sehr leicht zwicken, da es leere Arrays für mich zurückgab. $ tmp_Array [$ k] = strtolower ($ v -> $ sortby); – WastedSpace

Verwandte Themen