2012-04-15 17 views
1

Ok, vor allem bin ich mir nicht einmal sicher, ob der Titel stimmt, wenn ja, tut mir leid.php arrays sortierung enthaltener werte

Ich habe diese Schleife hier, die das Ergebnis einer MongoDB Abfrage ist:

foreach($cursor as $obj) { 
    $monster = $obj["type"]; 
    $strenght = $obj["strenght"]; 
    $obj["value"] = rand(5, 15); 
} 

jetzt habe ich rand dort gesetzt, dass value Änderungen für jede Iteration zu bedeuten. Jetzt möchte ich, dass dieses Array, wenn gedruckt wird, von diesem $obj["value"] bestellt wird, und in der Lage sein, wenn aufsteigend oder absteigend auszuwählen.


ok, ich habe diese

versucht
foreach($cursor as $obj) { 
    $type = $obj["monster"]; 
    $strenght = $obj["strenght"]; 
    $obj["value"] = rand(5, 15); 

    $newarr[] = $obj; 
} 

    usort($newarr, "cmp"); 
    function cmp($a, $b) 
    { return $b['value'] < $a['value']; } 

    foreach ($newarr as $obj) 
    { 
     echo $obj['value'] . $obj['type'] . "<br/>"; 
    } 

Wie ich erwartet hatte, die

$obj["value"] = rand(5, 15); 

wird nicht bei jeder Iteration in der Tat verloren, die $ newarr diesen Wert enthält, die Problem ist, dass es sie überhaupt nicht sortiert. Die Artikel werden in derselben Reihenfolge gedruckt, in der sie in das Array eingelegt wurden. Irgendeine Hilfe?

Dank

+0

Ich möchte darauf hinweisen, dass Sie "Stärke" falsch geschrieben haben. Zweimal. – Jack

+0

Ich bin nicht native lol –

Antwort

0
function mysort ($arr,$d='asc') { 
     global $dir; 
     $dir = $d; 
     uasort($arr, 'cmp'); 
     return ($arr); 
    } 
    function cmp ($a, $b) { 
     global $dir; 
     if($a['value'] == $b['value']) return 0; 
     else { 
      if(strtolower($dir) == 'asc') 
       return ($a['value'] > $b['value']) ? 1 : -1; 
      else if(strtolower($dir) == 'disc') 
       return ($a['value'] > $b['value']) ? -1 : 1; 

     } 
    } 
    print_r(mysort($obj, 'disc')); 

ENTSPRECHEND IHRER AKTUALISIERUNG

versuchen diese cmp()

function cmp($a, $b) { 
    if($a['value'] == $b['value']) return 0; 
    return $a['value'] > $b['value'] ? 1 : -1; 
} 
+0

Alles, was Sie mit dieser Antwort hinzufügen möchten? – Starx

+0

Ich denke, es ist ein bisschen zu komplex, da muss es kürzere Lösungen geben. Bitte werfen Sie einen Blick auf meine aktualisierte Frage ... vielleicht wissen Sie, was zu tun ist? Es ist ziemlich seltsam! –

0

Zunächst einmal, indem Sie $obj["value"] = rand(..) Sie gleichen Array-Variable mit unterschiedlichen Werten mehrfach zuweisen. Am Ende der Schleife enthält die Variable nur einen Wert.

Sie wurden wahrscheinlich versuchen, diese

$obj["value"][] = rand(5, 15); //This adds a new random item to the array contained in $obj['value'] each time 

zu tun, wenn Sie ein Array-Elemente haben, können Sie sie sortieren, indem sort()[aufsteigend] Funktion rsort()[absteigend mit [

$sorted = sort($obj["value"]); 
print_r($sorted); 
+0

Ich glaube nicht, dass der Wert verloren ist, ich gebe diesen Wert zu $ ​​Obj ["Wert"] und ** nicht ** '$ Wert' –

+0

@enrico, Natürlich die Der Wert wird bei jeder Iteration überschrieben. – Starx

+0

Nein, es ist nicht verloren. überprüfe meine Frage noch einmal, ich habe sie mit einigen Tests aktualisiert, die ich gemacht habe. –

0

Sie diesen Wert verlieren

$obj["value"] = rand(5, 15); 

bei jeder Iteration, denke ich. Überprüfen Sie diesen Link für php foreach-Schleife:

PHP FOREACH

Zum Sortieren u Sortierfunktion von PHP verwenden:

PHP SORT

+0

Seit wann mussten wir foreach verwenden, um das Array zu überprüfen. – Starx

+0

Ich überprüfe ein Array nicht, ich meine, enrico sollte einen Blick auf den Link werfen. –

0

Ihre foreach erzeugen nicht wirklich nützlich etwas wird.Also habe ich ein Beispiel-Array, das Prinzip zu veranschaulichen:

$array = array(
    array(
     'type' => 'type a', 
     'strength' => '10', 
     'value' => '12', 
    ), 
    array(
     'type' => 'type b', 
     'strength' => '12', 
     'value' => '15', 
    ), 
    array(
     'type' => 'type c', 
     'strength' => '11', 
     'value' => '6', 
    ), 
); 

Jetzt wollen Sie diese mehrdimensionale Array mit dem Wert sortiert werden, so dass Sie eine Liste haben würde, wenn es um hinunterstieg, vom Typ b, Typ a und geben Sie dann c ein.

Die function you are looking for is array_multisort(). Hier ein Beispiel, wie man es in dieser bestimmten Instanz benutzt. Zuerst müssen Sie dieses Sortierer-Array erstellen, damit die Funktion ihre Aufgabe erfüllt. Dann benutze einfach multisort und du bist fertig.

$sorter = array(); 

foreach ($array as $key => $row) { 
    $sorter[$key] = $row['value']; 
} 

array_multisort($sorter, SORT_DESC, $array); 

Jetzt $ Array wurde gemäß den Spezifikationen zurücksortiert. Verwenden Sie SORT_ASC, um die Sortierung umzukehren.

Added Code: Nur der Vollständigkeit halber ist hier Ihr foreach-Code, die technisch, was Sie in erster Linie schaffen sollten wollte:

$array = array(); 

foreach($cursor as $obj) { 
    $row = array(); 

    $row['type'] = $obj['type']; 
    $row['strength'] = $obj['strenght']; 
    $row['value'] = rand(5, 15); 

    $array[] = $row; 
} 

Auch Sie haben einen Tippfehler in Kraft :)

0

Da Sie mit ganzzahligen Werten arbeiten, können Sie einfach verwenden:

usort($newarr, "cmp"); 
function cmp($a, $b) { 
    return $b['value'] - $a['value']; 
} 

Es wird Ihre Schlüssel in absteigend sortieren Ending Order, wenn Sie das aufsteigend ändern möchten, tauschen Sie $ a und $ b.


Sortierfunktionen der Regel erwarten die Vergleichsfunktion einen Wert 0 zurück, wenn die Elemente die gleichen sind, < 0, falls das erste Argument kleiner als der zweite ist (was immer weniger Mittel in dem speziellen Fall) und> 0 wenn das erste Argument größer als das zweite ist.

Bei ganzzahligen Werten kann dies einfach als $ a - $ b oder $ b - $ a geschrieben werden.

+0

hey, bluewind, dieser Code gibt mir einen Warnfehler zurück: Warnung: usort() erwartet, dass Parameter 2 ein gültiger Callback ist, Funktion 'cmp' nicht gefunden oder ungültiger Funktionsname - ich lese irgendwo, dass ich ein Array mit übergeben muss eine Klasse wie diese usort ($ a, Array ("TestObj", "cmp")); aber ich sehe ehrlich gesagt keine Verwendung in meinem Fall ... was tun ?! Ich bin verzweifelt .. :( –

+0

Wenn Sie Cmp() als eine Funktion (nicht Methode einer Klasse) definieren, sollte es funktionieren. Für weitere Hilfe benötigen wir Ihren Code. – Bluewind

+0

es ist fast das gleiche wie Ihr Code ... usort ($ newarr, "cmp"); function cmp ($ a, $ b) {return 0;} .. ich habe return 0 für simplicity, aber es gibt mir immer noch diese warnung und sortiere nichts !! –