我有一个以随机顺序给我的数组。该数组是一个数组数组,我根据每个子数组中存在的键给出了一个放置数组的命令。
例如,我获得了数组array(array('id' => 1), array('id' => 2))
。我被告知根据每个子阵列的键'id'按顺序(2,1)排序数组。
在PHP中执行此操作的最有效方法是什么?
答案 0 :(得分:1)
PHP允许您编写自己的排序函数。我不能保证这个解决方案的效率,但它会起作用并且直接受到语言的支持,所以我喜欢它。
对于你的情况,你会写这样的东西:
function custom_sort_by_id($a, $b) {
// If the two IDs are the same, no sorting should be done
if ($a['id'] == $b['id']) {
return 0;
}
return ($a['id'] < $b['id']) ? -1 : 1;
}
然后您将按如下方式调用此函数:
usort($myarray, "custom_sort_by_id");
所以,例如,如果您有以下起始数组:
array(3) {
[0]=>
array(2) {
["id"]=> int(3)
["value"]=> int(1)
}
[1]=>
array(2) {
["id"]=> int(2)
["value"]=> int(2)
}
[2]=>
array(2) {
["id"]=> int(1)
["value"]=> int(3)
}
}
您将收到以下结果:
array(3) {
[0]=>
array(2) {
["id"]=> int(1)
["value"]=> int(3)
}
[1]=>
array(2) {
["id"]=> int(2)
["value"]=> int(2)
}
[2]=>
array(2) {
["id"]=> int(3)
["value"]=> int(1)
}
}
答案 1 :(得分:1)
效率很大程度上取决于您对数据的处理方式,所以这很难回答。最有效的方法是识别PHP数组是actually ordered maps,而从头开始用id键构造数组。另请注意,如果您需要将数组置于随机顺序中,则常规排序功能将无效:
<?php
function add ($needle, &$haystack)
{
$haystack[$needle['id']] = $needle;
}
$map = array();
add (array('id' => 1), $map);
add (array('id' => 10), $map);
add (array('id' => 100), $map);
add (array('id' => 1000), $map);
add (array('id' => 10000), $map);
$order = array(1,10000,10,1000,100);
foreach ($order as $o)
print_r ($map[$o]);
答案 2 :(得分:0)
最快的方法是创建另一个相同大小的数组,循环遍历随机数组并根据id放置它们。
这是假设id是有序的(也就是1到多少)
如果不是这种情况,那么你需要一个接一个地遍历它们,找到最低值并用另一个值交换它或者将它移动到另一个临时数组。
还有其他事情需要考虑,例如,列表有多大,如果列表真的很大,那么你可以使用类似快速排序的东西,虽然对于较小的列表,像气泡或插入排序的东西工作得很好
答案 3 :(得分:0)
我认为最有效率(尽管效率不太高)的方法是在2遍中完成:
使用相应的键创建一个关联数组:
foreach ($array as $item) $ids[$item['id']] = $item;
按给定顺序构造结果:
foreach ($order as $id) $result[] = $ids[$id];