按自定义顺序对多维数组排序
对多维数组按其关键值(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数组中,所以它按照先前的顺序进入最后)
我尝试了很多,但无法为此创建算法...我希望有些人会帮我...
由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']];
});
你需要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);
});
试试这个
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
)
)
这将尽可能慢。你实际上正在做一个[选择排序](http://en.wikipedia.org/wiki/Selection_sort),它具有不必要的高常数系数。 – Jon
你试过我的答案? –
为什么反对投票?请解释...这个问题以前从未有人问过任何社区 – agaggi
请参见[按自定义顺序对数组的php数组排序](http://stackoverflow.com/questions/11145393/sorting-a-php-array-of - 由自定义顺序排列) –