以已知顺序重新排序数组的最有效方法

时间:2011-09-12 03:12:01

标签: php performance algorithm sorting

我有一个以随机顺序给我的数组。该数组是一个数组数组,我根据每个子数组中存在的键给出了一个放置数组的命令。

例如,我获得了数组array(array('id' => 1), array('id' => 2))。我被告知根据每个子阵列的键'id'按顺序(2,1)排序数组。

在PHP中执行此操作的最有效方法是什么?

4 个答案:

答案 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到多少)

如果不是这种情况,那么你需要一个接一个地遍历它们,找到最低值并用另一个值交换它或者将它移动到另一个临时数组。

还有其他事情需要考虑,例如,列表有多大,如果列表真的很大,那么你可以使用类似快速排序的东西,虽然对于较小的列表,像气泡或插入排序的东西工作得很好

http://en.wikipedia.org/wiki/Sorting_algorithm

答案 3 :(得分:0)

我认为最有效率(尽管效率不太高)的方法是在2遍中完成:

  1. 使用相应的键创建一个关联数组:

    foreach ($array as $item) $ids[$item['id']] = $item;
    
  2. 按给定顺序构造结果:

    foreach ($order as $id) $result[] = $ids[$id];