2017-04-07 6 views
0

Ich habe PHP-Array, das Kundenspezifischer Auftrag für PHP-Array basiert auf Indizes

$my_arr['cats'] = array('Shadow', 'Tiger', 'Luna'); 
$my_arr['dogs'] = array('Buddy', 'Lucy', 'Bella'); 
$my_arr['dolphins'] = array('Sunny', 'Comet', 'Pumpkin'); 
$my_arr['lizzards'] = array('Apollo', 'Eddie', 'Bruce'); 
//and many more lines like this 

Ich brauche es zu sortieren, wie

schaut auf ihr basiert Tasten Sortier Array wie

$order = array('lizzards', 'cats'); 

Ich möchte, dass die erste Artikel sollte Lizzards Array, zweiter Artikel - Katzen und dann alle Artikel, die nicht in Array $ Auftrag angegeben wurden. Wie kann es mit usort/uasort/uksort Funktionen gemacht werden?

+0

Sie sind für Multi-Array Art suchen? http://php.net/manual/en/function.array-multisort.php – cosmoonot

+0

Nein, ich brauche keine Sortierung für innere Arrays – moonvader

Antwort

2

Sie können dies unter Code erreichen, indem

<?php 

function sortByKey(&$arr,$key_order) 
{ 
    if(count(array_intersect(array_keys($arr),$key_order))!=count($key_order)) 
    { 
     return false; 
    } 
    $ordered_keys=array_merge($key_order,array_diff(array_keys($arr),$key_order)); 
    $sorted_arr=[]; 
    foreach($ordered_keys as $key) 
    { 
     $sorted_arr[$key]=$arr[$key]; 
    } 
    $arr=$sorted_arr; 
    return true; 
} 

$my_arr=[]; 
$my_arr['cats'] = array('Shadow', 'Tiger', 'Luna'); 
$my_arr['dogs'] = array('Buddy', 'Lucy', 'Bella'); 
$my_arr['dolphins'] = array('Sunny', 'Comet', 'Pumpkin'); 
$my_arr['lizzards'] = array('Apollo', 'Eddie', 'Bruce'); 

$order = array('lizzards', 'cats'); 

if(sortByKey($my_arr,$order){ 
    echo "Sorting done successfully"; 
} 
else 
{ 
    echo "Sorting ignored, order element miss matched"; 
} 

print_r($my_arr); 
?> 
+0

Gute Eins; Nur Vorbehalt: Dies erfordert, dass alle Order-Schlüssel in '$ my_arr' vorhanden sind. Wenn das nicht garantiert ist, müssen Sie dafür einchecken. – deceze

+0

@deceze, wenn Sie diesen Code ausführen - Sie können sehen, dass es vollständige Array mit nur zwei Elemente sortiert in Reihenfolge Array – moonvader

+2

@deceze, habe ich auch diesen Fall ändern, wenn Reihenfolge Schlüssel ist nicht übereinstimmend, dann geben Sie false zurück –

1

eine kürzere Lösung mit uksort:

uksort($my_arr, function ($a,$b) use ($order) { 
    //Look for elements indexes in the 'order' array 
    $aKey = array_search($a, $order); 
    $bKey = array_search($b, $order); 

    if($aKey !== FALSE && $bKey !== FALSE) { 
     return $aKey - $bKey; 
    } else if($aKey !== FALSE) { 
     return -1; 
    } else if($bKey !== FALSE) { 
     return 1; 
    } 
    return 0; 
});