按自定义顺序对多维数组排序

问题描述:

对多维数组按其关键值(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 - 由自定义顺序排列) –

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

你需要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

试试这个

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