webentwicklung-frage-antwort-db.com.de

PHP Array nach zwei Feldwerten sortieren

Ich habe so ein Array 

 Array (
 [0] => Array ("Ziel" => "Sydney", 
 "Airlines" => "airline_1", 
 "One_way_fare" => 100, 
 " return_fare => 300 
), 
 [2] => Array ("Ziel" => "Sydney", 
 "Fluggesellschaften" => "airline_2", 
 "one_way_fare" => 150, 
 "return_fare => 350 
), 
 [3] => Array (" Ziel "=>" Sydney ", 
" Fluggesellschaften "=>" airline_3 ", 
" one_way_fare " => 180, 
 "Return_fare => 380 
) 
) 

Wie kann ich den Wert nach return_fare asc, one_way_fare asc sortieren?

Ich habe array_multisort () ausprobiert, aber am Ende habe ich die Daten gemischt.

asort funktioniert nur für ein dimensionales Array. Ich muss nach zwei oder mehr Werten sortieren. Wie kann ich dies wie in SQL erreichen? Nach Field1 Asc, Field2 Asc?

55
flyclassic

array_multisort() ist die richtige Funktion, die du irgendwie durcheinander gebracht haben musst:

// Obtain a list of columns
foreach ($data as $key => $row) {
    $return_fare[$key]  = $row['return_fare'];
    $one_way_fare[$key] = $row['one_way_fare'];
}

// Sort the data with volume descending, edition ascending
array_multisort($return_fare, SORT_ASC, $one_way_fare, SORT_ASC, $data);

Wenn Sie sich die Kommentare auf der PHP-Handbuchseite für array_multisort() ansehen, finden Sie eine sehr hilfreiche array_orderby()-Funktion, mit der Sie die oben genannten Punkte auf Folgendes reduzieren können:

$sorted = array_orderby($data, 'return_fare', SORT_ASC, 'one_way_fare', SORT_ASC);

Um die Schleife zu vermeiden, verwenden Sie array_column() (ab PHP 5.5.0):

array_multisort(array_column($data, 'return_fare'),  SORT_ASC,
                array_column($data, 'one_way_fare'), SORT_ASC,
                $data);
87
Tatu Ulmanen

Zusätzlich zu array_multisort(), für das Sie zuerst Spalten-Arrays erstellen müssen, gibt es auch usort(), für die dies nicht erforderlich ist.

usort($data, function($a, $b) { 
    $rdiff = $a['return_fare'] - $b['return_fare'];
    if ($rdiff) return $rdiff; 
    return $a['one_way_fare'] - $b['one_way_fare']; 
}); // anonymous function requires PHP 5.3 - use "normal" function earlier
31
etarion

Oder Sie können uasort wie folgt verwenden

uasort($arr, function($a,$b){
    $c = $a['return_fare'] - $b['return_fare'];
    $c .= $a['one_way_fare'] - $b['one_way_fare'];
    return $c;
});

Fiddle

Ein weiteres Beispiel mit dem Raumschiffoperator.

usort($data, function($a, $b) { 
    return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare'] 
});
5
user634545

Ohh, ich habe es geschafft, meine eigene Frage wieder zu lösen ....

function array_multi_sort($array, $on1,$on2, $order=SORT_ASC) 
{

    foreach($array as $key=>$value){
        $one_way_fares[$key] = $value[$on2];
        $return_fares[$key] = $value[$on1];
    }

    array_multisort($return_fares,$order,$one_way_fares,$order,$array);
}

Die Sache ist, dass ich den letzten Parameter $ array auf array_multisort($return_fares,$order,$one_way_fares,$order,$array); verpasst habe.

vorhin!

0
flyclassic

Ich beantworte das auf eine Weise, die generalisiert werden kann, unabhängig davon, wie viele Artikel Sie sortieren möchten!

Sortierung nach return_fare und one_way_fare:

usort($data, function($a, $b) {
   if ($a['return_fare'] != $b['return_fare']) {
      return $a['return_fare'] <=> $b['return_fare'];
   }

   return $a['one_way_fare'] <=> $b['one_way_fare'];
});

Sortierung nach return_fare, dann one_way_fare, dann destination:

usort($data, function($a, $b) {
   if ($a['return_fare'] != $b['return_fare']) {
      return $a['return_fare'] <=> $b['return_fare'];
   }

   if ($a['one_way_fare'] != $b['one_way_fare']) {
      return $a['one_way_fare'] <=> $b['one_way_fare'];
   }

   return strnatcasecmp($a['destination'], $b['destination']);
});

Sortierung nach nur return_fare:

usort($data, function($a, $b) {
   return $a['return_fare'] <=> $b['return_fare'];
});

Hinweis: Sie müssen keine anonyme Funktion mit usort verwenden!

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

usort($data, 'cmp');


// Use a function inside a class:
class MyClass {
   public static function compare($a, $b) {
      return $a['return_fare'] <=> $b['return_fare'];
   }
}

usort($data, ['MyClass', 'compare']);

Sie können diese auch mit dem Elvis Operator (?:) verketten:

usort($data, function($a, $b) {
      return $a['return_fare'] <=> $b['return_fare'] ?:
             $a['one_way_fare'] <=> $b['one_way_fare'] ?:
             strnatcasecmp($a['destination'], $b['destination']);
});

In diesem letzten Beispiel wurden der Spaceship Operator (<=>) und der Elvis Operator (?:) verwendet. Ist das Programmieren nicht großartig?

0
Westy92