2017-09-02 2 views
1

Ich habe eine Reihe von StdClass Objects und diese enthält verschiedene Car Typen (zB Compact Car, Minivan, etc.) sortiert nach Preis. Ich möchte das Array in der folgenden Reihenfolge sortieren:Wie würde ich ein Array von Std-Class-Objekten nach spezifischer Listing-Reihenfolge sortieren?

  • Economy Car
  • Compact Car
  • Mid-Size Car
  • Standardgröße Auto
  • Full-Size-Auto
  • Premium- Auto
  • Luxusauto
  • Standardgröße Convertible
  • Mid-Size SUV
  • Standard-SUV
  • Full-Size SUV
  • Minivan
  • Rest nach Preis sortiert Autos

Ich bin mir nicht sicher, ob es sinnvoll, diese zu sortieren macht Bestellung mit Schlüssel "Beschreibung" oder "Codes". Ich habe herausgefunden, wie man nach Preis sortiert, aber nicht sicher, wie man das Array in der oben genannten Reihenfolge neu anordnet. Jede Hilfe wäre willkommen. Vielen Dank!

Eingang Array:

array (
    0 => 
    stdClass::__set_state(array(
     'description' => 'Mid-Size SUV', 
     'codes' => 
     array (
     0 => 'IFAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '30.31', 
    )), 
    1 => 
    stdClass::__set_state(array(
     'description' => 'Standard-Size SUV', 
     'codes' => 
     array (
     0 => 'SFAR', 
     1 => 'RFAR', 
    ), 
     'max_people' => '7', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '35.53', 
    )), 
    2 => 
    stdClass::__set_state(array(
     'description' => 'Specialty Vehicle', 
     'codes' => 
     array (
     0 => 'XXAR', 
    ), 
     'max_people' => false, 
     'min_people' => false, 
     'max_bags' => '', 
     'min_bags' => '', 
     'price' => '36.72', 
    )), 
    3 => 
    stdClass::__set_state(array(
     'description' => 'Compact Car', 
     'codes' => 
     array (
     0 => 'CCAR', 
     1 => 'CDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '4', 
     'max_bags' => '3', 
     'min_bags' => '1', 
     'price' => '37.21', 
    )), 
    4 => 
    stdClass::__set_state(array(
     'description' => 'Economy Car', 
     'codes' => 
     array (
     0 => 'ECAR', 
     1 => 'EDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '4', 
     'max_bags' => '2', 
     'min_bags' => '1', 
     'price' => '37.21', 
    )), 
    5 => 
    stdClass::__set_state(array(
     'description' => 'Mid-Size Car', 
     'codes' => 
     array (
     0 => 'ICAR', 
     1 => 'IDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '39.46', 
    )), 
    6 => 
    stdClass::__set_state(array(
     'description' => 'Standard-Size Car', 
     'codes' => 
     array (
     0 => 'SCAR', 
     1 => 'SDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '41.77', 
    )), 
    7 => 
    stdClass::__set_state(array(
     'description' => 'Minivan', 
     'codes' => 
     array (
     0 => 'MVAR', 
    ), 
     'max_people' => '7', 
     'min_people' => '7', 
     'max_bags' => '5', 
     'min_bags' => '2', 
     'price' => '43.18', 
    )), 
    8 => 
    stdClass::__set_state(array(
     'description' => 'Full-Size Car', 
     'codes' => 
     array (
     0 => 'FCAR', 
     1 => 'FDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '43.50', 
    )), 
    9 => 
    stdClass::__set_state(array(
     'description' => 'Compact SUV', 
     'codes' => 
     array (
     0 => 'CFAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '3', 
     'min_bags' => '3', 
     'price' => '46.42', 
    )), 
    10 => 
    stdClass::__set_state(array(
     'description' => 'Full-Size Hybrid', 
     'codes' => 
     array (
     0 => 'FCAH', 
    ), 
     'max_people' => false, 
     'min_people' => false, 
     'max_bags' => '', 
     'min_bags' => '', 
     'price' => '48.00', 
    )), 
    11 => 
    stdClass::__set_state(array(
     'description' => 'Standard-Size Convertible', 
     'codes' => 
     array (
     0 => 'STAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '48.39', 
    )), 
    12 => 
    stdClass::__set_state(array(
     'description' => 'Sports Car', 
     'codes' => 
     array (
     0 => 'XSAR', 
     1 => 'SSAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '4', 
     'max_bags' => '3', 
     'min_bags' => '1', 
     'price' => '48.72', 
    )), 
    13 => 
    stdClass::__set_state(array(
     'description' => 'Premium Car', 
     'codes' => 
     array (
     0 => 'PCAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '2', 
     'price' => '48.72', 
    )), 
    14 => 
    stdClass::__set_state(array(
     'description' => 'Luxury Car', 
     'codes' => 
     array (
     0 => 'LCAR', 
     1 => 'LDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '5', 
     'min_bags' => '1', 
     'price' => '52.16', 
    )), 
    15 => 
    stdClass::__set_state(array(
     'description' => 'Full-Size SUV', 
     'codes' => 
     array (
     0 => 'FFAR', 
    ), 
     'max_people' => '8', 
     'min_people' => '7', 
     'max_bags' => '4', 
     'min_bags' => '2', 
     'price' => '52.92', 
    )), 
    16 => 
    stdClass::__set_state(array(
     'description' => 'Full-Size Van', 
     'codes' => 
     array (
     0 => 'FVAR', 
    ), 
     'max_people' => '15', 
     'min_people' => '12', 
     'max_bags' => '5', 
     'min_bags' => '1', 
     'price' => '90.38', 
    )), 
    17 => 
    stdClass::__set_state(array(
     'description' => 'Compact Convertible', 
     'codes' => 
     array (
     0 => 'CTAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '1', 
     'min_bags' => '1', 
     'price' => '91.17', 
    )), 
    18 => 
    stdClass::__set_state(array(
     'description' => 'Premium SUV', 
     'codes' => 
     array (
     0 => 'PFAR', 
     1 => 'UFAR', 
    ), 
     'max_people' => '7', 
     'min_people' => '5', 
     'max_bags' => '5', 
     'min_bags' => '1', 
     'price' => '92.64', 
    )), 
    19 => 
    stdClass::__set_state(array(
     'description' => 'Specialty Car', 
     'codes' => 
     array (
     0 => 'XCAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '3', 
     'min_bags' => '3', 
     'price' => '94.42', 
    )), 
    20 => 
    stdClass::__set_state(array(
     'description' => 'Mid-Size Convertible', 
     'codes' => 
     array (
     0 => 'ITAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '2', 
     'min_bags' => '2', 
     'price' => '97.98', 
    )), 
    21 => 
    stdClass::__set_state(array(
     'description' => 'Luxury SUV', 
     'codes' => 
     array (
     0 => 'LFAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '3', 
     'min_bags' => '3', 
     'price' => '113.66', 
    )), 
    22 => 
    stdClass::__set_state(array(
     'description' => 'Premium Convertible', 
     'codes' => 
     array (
     0 => 'PTAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '1', 
     'min_bags' => '1', 
     'price' => '121.15', 
    )), 
    23 => 
    stdClass::__set_state(array(
     'description' => 'Luxury Convertible', 
     'codes' => 
     array (
     0 => 'LTAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '1', 
     'min_bags' => '1', 
     'price' => '129.01', 
    )), 
    24 => 
    stdClass::__set_state(array(
     'description' => 'Premium Van', 
     'codes' => 
     array (
     0 => 'PVAR', 
    ), 
     'max_people' => '15', 
     'min_people' => '15', 
     'max_bags' => '1', 
     'min_bags' => '1', 
     'price' => '159.49', 
    )), 
    25 => 
    stdClass::__set_state(array(
     'description' => 'Specialty Convertible', 
     'codes' => 
     array (
     0 => 'XTAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '2', 
     'min_bags' => '2', 
     'price' => '307.64', 
    )), 
) 

Code:

usort($car_types,function($a,$b) { 
    return $a->price == $b->price ? 0 : $a->price > $b->price; 
}); 

usort($car_types, function($a, $b) use ($order) { 
    $a_set = intval(isset($order[$a->description])); 
    $b_set = intval(isset($order[$b->description])); 

    return $a_set === $b_set && $a_set === 1 
    ? $order[$a->description] - $order[$b->description] 
    : $b_set - $a_set; 
}); 
+0

Fügen Sie dem Objekt einen Wert für die Sortierreihenfolge hinzu und sortieren Sie diesen Wert. – ryantxr

+0

Sie müssen diesen Typen eine Sortierreihenfolge geben, und dann können Sie sortieren. Oder Sie müssen ein vordefiniertes Array mit diesen Namen erstellen und dann basierend auf diesen Namen Ihr Array sortieren. –

Antwort

0

definiert Array Bestellung und es verwendet, innerhalb usort:

$order = [ 
    'Economy Car' => 1, 
    'Compact Car' => 2, 
    'Mid-Size Car' => 3, 
    'Standard-Size Car' => 4, 
    'Full-Size Car' => 5, 
    'Premium Car' => 6, 
    'Luxury Car' => 7, 
    'Standard-Size Convertible' => 8, 
    'Mid-Size SUV' => 9, 
    'Standard SUV' => 10, 
    'Full-Size SUV' => 11, 
    'Minivan' => 12 
]; 

usort($car_types, function ($a, $b) use ($order) { 
    static $notSetPriority; 

    $aPriority = isset($order[$a->description]) 
     ? $order[$a->description] 
     : $notSetPriority ?? ($notSetPriority = count($order) + 1); 
    $bPriority = isset($order[$b->description]) 
     ? $order[$b->description] 
     : $notSetPriority; 

    if (($comparison = $aPriority - $bPriority) === 0) { 
     return floatval($a->price) - floatval($b->price); 
    } 

    return $comparison; 
}); 

Wenn das Auftragsgewicht für die Beschreibung nicht ist setzen, dann geben wir ein Gewicht von den meisten w acht plus eins.

Wenden Sie die usort nicht mehr als einmal an, da es schwierig ist, das Ergebnis vorherzusagen. Ich habe beide Sortierkriterien zu einem zusammengefasst.

+0

Vielen Dank! Dies ist perfekt. Eine Sache: Für die restlichen Autos, die nicht in $ Auftrag definiert sind (wie Mid-Size Specialty Vehicle) ... wie kann ich die restlichen Autos nach Preis sortieren? So zum Beispiel nach Minivan sollte Mid-Size-Specialty Vehicle, Kompakt-SUV, Pickup Standard-Größe, Specialty Vehicle und so weiter ... –

+0

@MichaelAlterio, sortiere ein Array nach Preis zuerst (gelten 'usort', dass Sie in der Frage angegeben), dann nach Beschreibung sortieren ('usort' aus der Antwort). Dies sollte den Trick machen. – sevavietl

+0

Ich habe den ursprünglichen Beitrag mit einem nach Preis sortiert (niedrigste bis höchste) Input Array aktualisiert. Wenn ich nach dem Preis sortiere und dann den Auftrag usort oben verwende, sortiere ich nicht nach dem niedrigsten bis zum höchsten Preis nach der Bestellung. Irgendwelche Ideen was passiert? –