我有两个数组,两个都是多维的,具有相同数量的元素和相同的值,它们位于不同的位置(这些值实际上是我数据库中的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;
}
我认为这个解决方案并不好,因为我认为这是一个非常简单的问题(也许它甚至不正确)。我错过了PHP中更简单的方法吗?
答案 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
函数修改为仅从我们尚未检查的数组部分开始。通过一种更有效的方式扫描阵列。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)。
它提供了一种使用用户提供的比较函数对数组进行排序的简单方法。