我正在尝试用另一个数组对多维数组进行排序,但到目前为止还很短。
array_multisort
似乎只适用于真正的排序。
假设我有这两个数组:
$order = array(2,3,1);
$data = array(
array('id' => 1, 'title' => 'whatever'),
array('id' => 2, 'title' => 'whatever'),
array('id' => 3, 'title' => 'whatever')
);
现在我想$data
根据数组中的顺序对数组进行排序$order
。
这就是我想要的结果:
$data = array(
array('id' => 2, 'title' => 'whatever'),
array('id' => 3, 'title' => 'whatever')
array('id' => 1, 'title' => 'whatever'),
);
我可以通过运行嵌套循环轻松完成此任务,但这不能很好地扩展(我的数组非常大,并且数组有更多字段)。
发布于 2018-09-29 12:01:10
在PHP中没有内置函数,我无法想到任何自定义函数,这将使用usort执行此操作。但是array_map很简单,imo,那么为什么不使用呢?
$sorted = array_map(function($v) use ($data) {
return $data[$v - 1];
}, $order);
发布于 2018-09-29 13:10:58
在您的示例中,$ data数组中的ID是连续编号的,从1开始。我在下面给出的代码假设始终如此。如果不是这种情况,则代码不起作用。
$result = array();
$index = 0;
foreach ($order as $position) {
$result[$index] = $data[$position - 1];
$index++;
}
在http://codepad.org/YC8w0yHh,您可以看到它适用于您的示例数据。
编辑
如果上述假设不成立,则以下代码将实现相同的结果:
<?php
$data = array(
array('id' => 1, 'title' => 'whatever'),
array('id' => 2, 'title' => 'whatever'),
array('id' => 3, 'title' => 'whatever')
);
$order = array(2,3,1);
$order = array_flip($order);
function cmp($a, $b)
{
global $order;
$posA = $order[$a['id']];
$posB = $order[$b['id']];
if ($posA == $posB) {
return 0;
}
return ($posA < $posB) ? -1 : 1;
}
usort($data, 'cmp');
var_dump($data);
有关证据,请参见http://codepad.org/Q7EcTSfs。
通过在$ order数组上调用array_flip(),它可以用于位置查找。这类似于哈希表查找,它在时间上是线性的,或者是O(n)。你不能做得更好。
https://stackoverflow.com/questions/-100002804
复制相似问题