如何更好地排序?

时间:2013-03-07 23:13:10

标签: php arrays sorting

我有两个数组,两个都是多维的,具有相同数量的元素和相同的值,它们位于不同的位置(这些值实际上是我数据库中的ID-s,所以一个ID只出现一次)。如何使用第一个数组中的值对第二个数组进行排序?

例如 - 如果第一个数组看起来像:

$array1[0][0] = 1;
$array1[0][x] = it doesn't matter what's here
$array1[1][0] = 4;
$array1[1][x] = it doesn't matter what's here
$array1[2][0] = 3;
$array1[2][x] = it doesn't matter what's here
...

如何对第二个数组进行排序,使它在索引[0] [0],[1] [0],[2] [0]等上具有与array1相同的值。

我如何解决问题是:

$i=0
while ($i < (count($array1)-2)){ // * check down

  $find_id = $array1[$i][0];

  // here I need to search for index of that ID in other array
  $position = give_index($find_id, $array2);

  // swapping positions
  $temp = array2[$i][0];
  $array2[$i][0] = $array2[$position][0];
  $array2[$position][0] = $temp;

  // increasing counter
  i++;
}

function give_index($needle, $haystack){
  for ($j = 0, $l = count($haystack); $j < $l; ++$j) {
        if (in_array($needle, $haystack[$j][0])) return $j;
  }
  return false;
}
  • *只有-2,因为索引从0开始,也是最后一个你不需要检查的元素,因为它会被while循环的最后一次迭代自动排序。

我认为这个解决方案并不好,因为我认为这是一个非常简单的问题(也许它甚至不正确)。我错过了PHP中更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

这是我能想到的最有效的方式:

function swap(&$a, &$b) { 
    $t = $a;
    $a = $b;
    $b = $t;
}

function find_index($id, $array, $from = 0) {
    $index = false;
    for ($i = $from, $c = count($array); $i < $c; $i++) {
        if ($array[$i][0] == $id) {
            $index = $i;
            break;
        }
    }
    return $index;
}

for ($i = 0, $c = count($array1); $i < ($c - 2); $i++) {
    if ($array1[$i][0] != $array2[$i][0]) {
        $fi = find_index($array1[$i][0], $array2, $i);
        swap($array2[$i][0], $array2[$fi][0]);
    }
}

你的改变是什么?

  • 我已经定义了一个swap()函数来交换任何变量。这不需要任何费用,并使一切看起来更好。如果需要,您也可以稍后重复使用该功能。
  • find_index(代码中为give_index)中,一旦找到正确的索引,我们就会停止循环。我们还避免了in_array函数调用的成本。
  • 我们将find_index函数修改为仅从我们尚未检查的数组部分开始。通过一种更有效的方式扫描阵列。
  • 在for循环中(while循环错误)我们存储了数组的count一次,避免了多次调用。
  • 我们也只在错误的地方交换$array2值。

其他改进

如果你知道$array2数组的任何其他内容,你可以使它更高效。例如,如果您知道索引是像$array1中那样交替的,则可以从以下位置更改主for循环:

for ($i = 0, $c = count($array1); $i < ($c - 2); $i++) {

for ($i = 0, $c = count($array1); $i < ($c - 2); $i+2) { 

(注意最后的$i+2)您也可以在find_index函数中执行此操作。

答案 1 :(得分:0)

查看usort(http://php.net/manual/en/function.usort.php)。

它提供了一种使用用户提供的比较函数对数组进行排序的简单方法。