比较PHP中的两个数组并获得键的差异

比较PHP中的两个数组并获得键的差异,php,arrays,Php,Arrays,我一直在阅读手册,以找到一个功能,做我想要的,但我最终做了自己。我想比较两个数组并计算键之间的差异。或者更实际地按值的顺序分析差异 我已经做到了以下几点,但我有一种感觉,这可以做得更好 如果有人知道如何改进,请告诉我,因为我渴望改进 <?php $goodarray = array(300,250,200,150,100); $usersupliedarray = array(250,300,200,150,100); // first two spots are wrong $sco

我一直在阅读手册,以找到一个功能,做我想要的,但我最终做了自己。我想比较两个数组并计算键之间的差异。或者更实际地按值的顺序分析差异

我已经做到了以下几点,但我有一种感觉,这可以做得更好

如果有人知道如何改进,请告诉我,因为我渴望改进

<?php
$goodarray = array(300,250,200,150,100);

$usersupliedarray = array(250,300,200,150,100); // first two spots are wrong

$score = count($goodarray);

foreach($usersupliedarray as $key => $value){

    $arraykey = array_search($value, $goodarray);

    $difference = abs($key-$arraykey);

    $score = $score + $difference;


    echo "$value $goodarray[$key] ($difference = $score) <hr />";

}

带有空回调的数组映射
在这里可以派上用场,例如

$a = array(300,250,200,150,100);
$b = array(250,300,200,150,100);

$faults = 0;
foreach(array_map(null, $a, $b) as $x)
    $faults += $x[0] != $x[1]; // x[0] is $a element, x[1] is $b

print $faults; // 2
UPD:如果您想计算相等元素之间的距离,而不仅仅是计算差异,那么我觉得您的原始代码很好。可以进行的一项改进是,消除低效的
数组搜索
,并使用第一个数组的“反向索引”:

foreach($a as $pos => $val)
    $inv[$val] = $pos;
或者只是

$inv = array_flip($a);
然后

foreach($b as $pos => $val)
    $score += abs($pos - $inv[$val]);

我想这是你的作业吧?这不是幸运的。谢谢你的关心;-)嗨,乔治,我得仔细看看你的代码;)谢谢,一旦我完全理解了,我会让你知道的。哈格奥尔格,谢谢你给我看了一个空回调的数组映射,我现在看到它生成了一个数组。我所寻找的是一种按照值的顺序来计算差值的方法。所以,如果有人是一步,它只有1,但如果有人是3步,他是“穿”与3。无论如何,你的例子给了我足够的新信息,使你的文章有用。谢谢你+1@rinserepeat:哎呀,看来我看错问题了!我已经更新了我的帖子。哈,乔治,非常感谢你的建议。非常感谢。每天学习:)@rinserepeat:很高兴它有帮助。是的,
array\u flip
是个好主意,更新了答案。