608 Stimmen

Wie sortiert man ein Array von assoziativen Arrays nach dem Wert eines bestimmten Schlüssels in PHP?

Angesichts dieser Anordnung:

$inventory = array(

   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),
   array("type"=>"pork", "price"=>5.43),

);

Ich möchte sortieren $inventory Elemente nach Preis zu erhalten:

$inventory = array(

   array("type"=>"pork", "price"=>5.43),
   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),

);

Wie kann ich das tun?

3 Stimmen

1 Stimmen

Warum strukturieren Sie Ihr Eingabefeld nicht einfach so um, dass die price Spalte steht an erster Stelle und type an zweiter Stelle? Auf diese Weise können Sie einfach aufrufen rsort() . 3v4l.org/2meqs

0 Stimmen

21voto

kenorb Punkte 134883

Sie können verwenden usort mit anonymer Funktion, z.B.

usort($inventory, function ($a, $b) { return strnatcmp($a['price'], $b['price']); });

0 Stimmen

Versionen PHP 5 >= 5.5.0, PHP 7 für diejenigen unter Ihnen, die wie ich wirklich wollten, dass dies für sie funktioniert

1 Stimmen

Erstaunlich, dass strnatcmp die für den Vergleich von Zeichenketten gedacht ist, scheint hier gut zu funktionieren. Offenbar beinhaltet die "natürliche Ordnung", die es implementiert, das Sortieren numerischer Zeichenketten nach Zahlen und nicht nach lexikalischen Kriterien.

17voto

Kamal Punkte 716

Desde Sortieren eines Arrays von assoziativen Arrays nach dem Wert des angegebenen Schlüssels in php :

durch Verwendung von usort ( http://php.net/usort ), können wir ein Array in aufsteigender und absteigender Reihenfolge sortieren. Wir müssen nur eine Funktion erstellen und sie als Parameter in usort übergeben. Wie im folgenden Beispiel verwendet größer als für aufsteigende Reihenfolge, wenn wir weniger als Bedingung übergeben, dann ist es in absteigender Reihenfolge zu sortieren. Beispiel:

$array = array(
  array('price'=>'1000.50','product'=>'test1'),
  array('price'=>'8800.50','product'=>'test2'),
  array('price'=>'200.0','product'=>'test3')
);

function cmp($a, $b) {
  return $a['price'] > $b['price'];
}

usort($array, "cmp");
print_r($array);

Sortie :

Array
 (
    [0] => Array
        (
            [price] => 200.0
            [product] => test3
        )

    [1] => Array
        (
            [price] => 1000.50
            [product] => test1
        )

    [2] => Array
        (
            [price] => 8800.50
            [product] => test2
        )
  )

1 Stimmen

Diese Antwort ist in der Warteschlange für minderwertige Überprüfungen aufgetaucht, vermutlich weil Sie keine Erklärung des Codes liefern. Wenn dieser Code die Frage beantwortet, sollten Sie in Ihrer Antwort einen Text hinzufügen, der den Code erklärt. Auf diese Weise erhalten Sie mit größerer Wahrscheinlichkeit mehr Bewertungen - und helfen dem Fragesteller, etwas Neues zu lernen.

1 Stimmen

-1; die cmp Funktion ist hier falsch. Sie sollte zurückgeben "eine ganze Zahl, die kleiner, gleich oder größer als Null ist, wenn das erste Argument als kleiner, gleich oder größer als das zweite Argument angesehen wird" sondern gibt stattdessen true o false . Es scheint bemerkenswerterweise trotzdem zu funktionieren - vielleicht weil die derzeitige Umsetzung von usort und Freunde behandeln die Fälle "kleiner als" und "gleich" identisch - aber verlassen Sie sich nicht darauf, dass das auch in zukünftigen PHP-Versionen noch funktioniert. Wenn sie versuchen, die Sortierung stabil zu machen (d.h. gleiche Elemente nicht unnötig zu verschieben), wird das nicht funktionieren.

0 Stimmen

Auch, usort wäre besser geeignet als uasort hier, da uasort bewahrt die Assoziation zwischen Schlüsseln und Werten, die verwirrend und unerwartet ist, wenn man es mit einem sequentiellen numerischen Array zu tun hat. Zum Beispiel, die Indizes von $array oben nach dem Aufruf von uasort sind 2, 0 und 1, in dieser Reihenfolge. Wenn Sie das nicht aus irgendeinem Grund wollen, ist es wahrscheinlich besser, wenn Sie usort , die das Array neu indiziert und neu ordnet.

14voto

danamlund Punkte 616
$inventory = 
    array(array("type"=>"fruit", "price"=>3.50),
          array("type"=>"milk", "price"=>2.90),
          array("type"=>"pork", "price"=>5.43),
          );

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

usort($inventory, "pricesort");
// uksort($inventory, "pricesort");

print("first: ".$inventory[0]['type']."\n\n");
// for usort(): prints milk (item with lowest price)
// for uksort(): prints fruit (item with key 0 in the original $inventory)

// foreach prints the same for usort and uksort.
foreach($inventory as $i){
  print($i['type'].": ".$i['price']."\n");
}

Ausgänge:

first: pork

pork: 5.43
fruit: 3.5
milk: 2.9

8voto

Arda Basoglu Punkte 1130

Für PHP 7 und spätere Versionen.

/**
 * A method for sorting associative arrays by a key and a direction.
 * Direction can be ASC or DESC.
 *
 * @param $array
 * @param $key
 * @param $direction
 * @return mixed $array
 */
function sortAssociativeArrayByKey($array, $key, $direction){

    switch ($direction){
        case "ASC":
            usort($array, function ($first, $second) use ($key) {
                return $first[$key] <=> $second[$key];
            });
            break;
        case "DESC":
            usort($array, function ($first, $second) use ($key) {
                return $second[$key] <=> $first[$key];
            });
            break;
        default:
            break;
    }

    return $array;
}

Verwendung:

$inventory = sortAssociativeArrayByKey($inventory, "price", "ASC");

1 Stimmen

Hat wunderbar funktioniert.

7voto

mirado Punkte 91

Yo uso uasort wie diese

<?php
$users = [
    [
        'username' => 'joe',
        'age' => 11
    ],
    [
        'username' => 'rakoto',
        'age' => 21
    ],
    [
        'username' => 'rabe',
        'age' => 17
    ],
    [
        'username' => 'fy',
        'age' => 19
    ],    
];

uasort($users, function ($item, $compare) {
    return $item['username'] >= $compare['username']; 
});

var_dump($users);

1 Stimmen

Code-only-Antworten sind auf Stack Overflow von geringem Wert, da sie den OP und Tausende von zukünftigen Forschern nur unzureichend aufklären und befähigen. Darüber hinaus hilft es den Forschern NICHT, Techniken vorzuschlagen, die bereits vor Jahren zur Verfügung gestellt wurden. Vielmehr verschwendet es ihre Forschungszeit, weil sie am Ende mehr Inhalte lesen, aber keine neuen Informationen erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X