0

我有 2 个数组,它们都是多维的,具有相同数量的元素和相同的值,它们位于不同的位置(这些值实际上是我数据库中的 ID,所以一个 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 中是否有我缺少的更简单的方法?

4

2 回答 2

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_indexgive_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函数中做到这一点。

于 2013-03-08T00:40:06.217 回答
0

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

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

于 2013-03-08T00:59:00.963 回答