按照另一个数组的键对数组进行排序

4

有两个数组,它们的长度相同,键也相同:

$a1 = [1=>2000,65=>1354,103=>1787];
$a2 = [1=>'hello',65=>'hi',103=>'goodevening'];

asort($a1);

a1和a2的键是来自数据库的id。

a1按值排序。排序后,我们如何在a2中使用相同的排序顺序呢?

谢谢!

4个回答

5
我相信这个可以运行:
$a1 = array(1=>2000,65=>1354,103=>1787);
$a2 = array(1=>'hello',65=>'hi',103=>'goodevening');

asort($a1); // sort $a1, maintaining array index

// sort $a2 by key, using the order of $a1
function my_uksort($a, $b) {
    global $a1;

    return $a1[$a] < $a1[$b] ? -1 : 1;
}
uksort($a2, 'my_uksort');

var_dump($a1);
var_dump($a2);

谢谢!这似乎非常有效。我更喜欢使用自定义排序函数而不是使用foreach。 - DADU
谢谢,这也帮了我很大的忙。 - DobotJr

1

可能不是最优的,但很短:

$a1 = array(1=>2000,65=>1354,103=>1787);
$a2 = array(1=>'hello',65=>'hi',103=>'goodevening');
asort($a1);

foreach(array_keys($a1) as $i) $out[$i] = $a2[$i];

echo join("\n", $out);

也可以看一下uasort()函数


0

如果你能接受丢失 ID 关联(数组将被重新索引),那么你可能想看一下 array_multisort()

array_multisort($a1, $a2);

我无法处理丢失关键联想,因为这形成了两个数组之间的关系。 - DADU
关系将保持不变。问题是,如果您稍后在某个地方使用这些真实(数据库)ID,则需要它们。如果您需要它们,则无法在一个调用中完成(请参见:http://php.net/manual/en/array.sorting.php)。只需使用其他答案中提供的自定义用户排序函数即可。 - Karol J. Piczak

0
foreach($a1 as $key => $value){
   //do something with $a2
   echo $a2[$key];
}

那么没有内置的 PHP 函数可以完成这个任务吗? - DADU
@marbrun:您可以使用一些内置的PHP函数使其工作。我发现这样更加容易。据我所知,没有一个函数可以为您完成它并仍然保持关键联接。 - munch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接