在PHP中查找两个不同长度数组之间的唯一差异

时间:2018-05-08 18:16:46

标签: php arrays

请问,如果两个数组相等而忽略重复数字,我该怎么比较?然后输出唯一的比较值和唯一不同的值。

这是我的数组

$ a1 =数组(1,2,9,2,4,5,5,7);
$ a2 =数组(1,2,4,3,3,5,6,7,9,2);

我的预期输出:

比较值= 1,2,4,5,7,9
差异= 3,6
output = false

我试过$ a1 == $ a2
我也尝试了各种各样的方法,但他们并没有做好。

3 个答案:

答案 0 :(得分:4)

要忽略重复的数字,首先要通过array_unique运行每个数组。

$a1 = array_unique($a1);
$a2 = array_unique($a2);

如果需要保留原始值,可以将唯一数组分配给新变量。

现在,找到共同的元素很容易:

$compared_values = array_intersect($a1, $a2);

但找到差异是有点棘手。 array_diff返回其第一个参数中的值,这些值不会出现在后续参数中。因此,根据参数的顺序,它可能会返回不同的结果。 (例如,array_diff([1], [1, 2, 3]);的结果将是一个空数组。)

为了确保获得完整的差异,您可以合并两种方式的结果。

$differences = array_merge(array_diff($a1, $a2), array_diff($a2, $a1));

要查看两个数组是否包含相同的不同值集,您只需将$differences计算为布尔值即可。如果它是空的,它将被评估为假,反之亦然。

$output = !$differences;

否定它会将其隐式地转换为布尔值,因此如果存在任何差异则为false,如果它为空则为{。

您尝试的方式$a1 == $a2无法正常工作,因为PHP中的array equality表示两个数组具有相同的键/值对。重复的值和不同的顺序(因此不同的键)将阻止它们相等。

答案 1 :(得分:3)

那好吧......我至少要写一些利用过多PHP数组函数的东西...

<?php

$a1 = array(1, 2, 9, 2, 4, 5, 5, 7); 
$a2 = array(1, 2, 4, 3, 3, 5, 6, 7, 9, 2);

$diff = array_diff($a2, $a1);

sort($a1);

echo 'compared values = ' . implode(",", array_unique($a1)) . '<br>'; 
echo 'differences = ' . implode(",", array_unique($diff)) . '<br>';
//?
$output = (empty($diff)) ? 'true' : 'false';
echo 'output = ' . $output;
  

比较值= 1,2,4,5,7,9

     

差异= 3,6

     

output = false

答案 2 :(得分:2)

这是非常难看的代码,就像我为你做了一个概念验证,我会让你优化以满足你的需求。这将为您提供预期的结果。我希望它有所帮助。 *当数组不相同时,我只假设output = false。如果我错了,请随时告诉我。

//Array 1
$a1 = array(1, 2, 9, 2, 4, 5, 5, 7); 
//Array 2
$a2 = array(1, 2, 4, 3, 3, 5, 6, 7, 9, 2 );

//To get your example results, they need to be sorted and the duplicates removed.
$a1 = array_unique($a1);
$a2 = array_unique($a2);
sort($a1);
sort($a2);
//Get smaller array as array1
$array1 = (sizeof($a1) > sizeof($a2)) ? $a1:$a2;
//Get bigger array as array2
$array2 = (sizeof($a1) < sizeof($a2)) ? $a1:$a2;
//Check the difference between each.
$diff = array_diff($array1, $array2);


echo "Compared values = " . implode(',', array_intersect($a1, $a2)).PHP_EOL;
echo "differences = " . implode(',', $diff).PHP_EOL;
echo "output = " . (($diff) ? "false" : "true");