1

我有两个相同维度的数组。数组中的每个值都是一个数字ab

$array3获得相同维度的最快方法是什么,其中包含:

a,如果两个值都是 a,

b,如果两个值都是 b,

0,如果值不同。

$array1 = array(a,b,b,a,a,b,a,b,a,a,b,b,a);
$array2 = array(a,b,a,b,a,a,b,a,b,b,a,b,a);
==================
$array3 = array(a,b,0,0,a,0,0,0,0,0,0,b,a);

性能怎么样,我相信使用循环语句不是最好的方法。

我相信可以以适当的方式使用类似的东西60&13 = 12,但我既不知道如何将它用于数组,也不知道如何将它用于大数字(如果数组很大)。或者,最好使用匿名函数?

关于最佳(但并非最不重要)解决方案的任何想法?谢谢你。

4

4 回答 4

5

循环几乎肯定是这里最好的方法。你不需要任何花哨的东西:

$items = min(count($array1), count($array2));
$array3 = array_fill(0, $items, 0); // initialize as all zeroes

for($i = 0; $i < $items; ++$i) {
    if ($array1[$i] === $array2[$i]) {
        $array3[$i] = $array1[$i];
    }
}

这将比因为函数调用在 PHP 中相对昂贵而快得多。array_map

如果您想要比这更好的性能,那么您的首要考虑应该是替换SplFixedArrayfor $array3

$array3 = new SplFixedArray($items); // and the rest as above
于 2013-08-08T15:45:23.767 回答
4

您可以使用array_map

$array3 = array_map(function($x, $y) {
    return $x == $y ? $x : 0;
}, $array1, $array2);
于 2013-08-08T15:43:34.250 回答
2

以为我会添加另一种方法,使用array_diff_assoc

$temp = array_diff_assoc($array1,$array2); //array of elements in array1 that aren't the same as array2
$temp = array_combine(array_keys($temp),array_pad(array(),count($temp),0)); //replace the values with 0s
$array3 = $temp + $array2; //merge the arrays
ksort($array3); //put the elements back in order
于 2013-08-08T15:55:21.483 回答
2
$array3 = array_intersect_assoc($array1, $array2);
$array3 = array_replace(array_fill(0, count($array1), 0), $array3);
于 2013-08-09T01:29:41.297 回答