2017-04-07 30 views
0

我有PHP数组,看起来像按订单

$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 

我需要根据它的键使用排序数组一样

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

排序它,我想第一项目应该是lizzards数组,第二项 - 然后所有未在$ order数组中指定的项目。如何使用usort/uasort/uksort函数来完成?

+0

您正在寻找多数组排序? http://php.net/manual/en/function.array-multisort.php – cosmoonot

+0

不,我不需要排序内部阵列 – moonvader

回答

2

您可以通过下面的代码

<?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

好的;只有警告:这要求所有的订单键存在于'$ my_arr'中。如果不能保证,你需要为此付款。 – deceze

+0

@deceze,如果你运行这个代码 - 你可以看到它正在排序完整的数组,只有两个项目中指定的数组 – moonvader

+2

@deceze,我也改变了这种情况,如果订单键不匹配,然后返回false –

1

使用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; 
});