2014-02-28 99 views
1

對多維數組按其關鍵值(asc或desc)進行排序會被問到太多次。 但我還沒有找到任何解決方案,我的問題,你必須按預定義的自定義順序中的一個關鍵值排序多維數組。按自定義順序對多維數組排序

採取例如

$array[0] = array('id'=> '111', value=>'abc'); 
$array[1] = array('id'=> '100', value=>'abc'); 
$array[2] = array('id'=> '132', value=>'abc'); 
$array[3] = array('id'=> '222', value=>'abc'); 
$array[4] = array('id'=> '112', value=>'abc'); 
$array[5] = array('id'=> '200', value=>'abc'); 

,並向該陣列由子項的「id」在下面陣列定義的順序進行排序的數組:

$sort_order_id = array('112','111','132','100'); 

所以結果將是

$array[0] = array('id'=> '112', value=>'abc'); 
$array[1] = array('id'=> '111', value=>'abc'); 
$array[2] = array('id'=> '132', value=>'abc'); 
$array[3] = array('id'=> '100', value=>'abc'); 
$array[4] = array('id'=> '222', value=>'abc'); 
$array[5] = array('id'=> '200', value=>'abc'); 

注意:如果某些ID在$ sort_order_id數組中不可用,請保留它們在上一個例子(如上面的例子id 222和200不在$ sort_order_id數組中,所以它按照先前的順序進入最後)

我嘗試了很多,但無法爲此創建算法...我希望有些人會幫我...

+0

你試過我的答案? –

+0

爲什麼反對投票?請解釋...這個問題以前從未有人問過任何社區 – agaggi

+0

請參見[按自定義順序對數組的php數組排序](http://stackoverflow.com/questions/11145393/sorting-a-php-array-of - 由自定義順序排列) –

回答

4

id以標準代碼排序的數組:

usort($data, function($x, $y) { return $x['id'] - $y['id']; }); 

你想要做的是什麼樣不是由IDS本身,而是由「重量」每個id(它代表您希望將id放入的任意順序)。因此,讓一個數組,其中鍵ID和值的權重,並用它來編號轉換爲權重:

// array_flip turns 0 => 112, 1 => 111, ... into 122 => 0, 111 => 1, ... 
$weights = array_flip(array('112','111','132','100')); 

usort($data, function($x, $y) use($weights) { 
    return $weights[$x['id']] - $weights[$y['id']]; 
}); 

更新:既然你也想處理IDS沒有指定的體重,你將有進一步擴大上述:

usort($data, function($x, $y) use($weights) { 
    if (!isset($weights[$x['id']], $weights[$y['id']])) { 
     // none of the ids have weight, so sort by bare id 
     return $x['id'] - $y['id']; 
    } 
    else if (!isset($weights[$x['id']])) { 
     // x does not have weight, put it last 
     return 1; 
    } 
    else if (!isset($weights[$y['id']])) { 
     // y does not have weight, put it last 
     return -1; 
    } 

    // both have weights, use them 
    return $weights[$x['id']] - $weights[$y['id']]; 
}); 
+0

我編輯了我的問題,請檢查 – agaggi

+0

接受爲答案,因爲它比其他人快。謝謝...如果(!isset($ weights [$ x ['id']],$ weights [$ y ['id']])){if(!isset($ weights [$ x [ ''']])&&!isset($ weights [$ y ['id']])){ – agaggi

0

你需要usort(),它允許你通過定製需求進行排序。在你的情況下,你需要根據你的sort_order_id陣列中ID的位置進行排序。

$array = array(
    array('id'=> '111', value=>'abc'), 
    array('id'=> '100', value=>'abc'), 
    array('id'=> '132', value=>'abc'), 
    array('id'=> '112', value=>'abc') 
); 
$sort_order_id = array('112','111','132','100'); 
usort($array, function($a, $b) { 
    global $sort_order_id; 
    return array_search($a['id'], $sort_order_id) - array_search($b['id'], $sort_order_id); 
}); 
+1

在排序之前翻轉排序順序將允許您用'O(n)''array_search'替換' O(1)'數組查找,可能使排序更加快速。 – Jon

+0

確實夠... – Utkanos

0

試試這個

echo "<pre>"; 

$array[0] = array('id'=> '111', 'value'=>'abc'); 
$array[1] = array('id'=> '100', 'value'=>'abc'); 
$array[2] = array('id'=> '132', 'value'=>'abc'); 
$array[3] = array('id'=> '222', 'value'=>'abc'); 
$array[4] = array('id'=> '112', 'value'=>'abc'); 
$array[5] = array('id'=> '200', 'value'=>'abc'); 

$arr_temp = $array; 
$array = array(); 
$sort_order_id = array('112','111','132','100'); 
foreach($sort_order_id as $order_id) 
{ 
    foreach($arr_temp as $key=>$arr) 
    { 
     if($arr['id'] == $order_id) 
     { 
      $array[] = $arr; 
      unset($arr_temp[$key]); 
     } 
    } 
} 

foreach($arr_temp as $key=>$arr) 
{ 
     $array[] = $arr; 
     unset($arr_temp[$key]); 
} 

print_r($array); 

OUTPUT:

Array 
(
    [0] => Array 
     (
      [id] => 112 
      [value] => abc 
     ) 

    [1] => Array 
     (
      [id] => 111 
      [value] => abc 
     ) 

    [2] => Array 
     (
      [id] => 132 
      [value] => abc 
     ) 

    [3] => Array 
     (
      [id] => 100 
      [value] => abc 
     ) 

    [4] => Array 
     (
      [id] => 222 
      [value] => abc 
     ) 

    [5] => Array 
     (
      [id] => 200 
      [value] => abc 
     ) 

) 
+0

這將盡可能慢。你實際上正在做一個[選擇排序](http://en.wikipedia.org/wiki/Selection_sort),它具有不必要的高常數係數。 – Jon