PHP数组如何检查所有值是否存在于另一个数组中

3

我有这样的数组:

$array1 = [1,2,3]; 

$array2 = [3,2,1]; 
$array3 = [2,1,3]; 
$array4 = [2,1,3]; 
$array5 = [1,1,1]; 
$array6 = [3,3,2]; 
$array7 = [1,2,1];
$array8 = [8,9,2]; 

我想检查array2到array8与array1的比较情况。它应该给我期望的返回结果,如下所示:
$array2 = [3,2,1]; return 'match'
$array3 = [2,1,3]; return 'match'
$array4 = [2,3,1]; return 'match'
$array5 = [1,1,1]; return 'not match'
$array6 = [3,3,2]; return 'not match'
$array7 = [1,2,1]; return 'not match'
$array8 = [8,9,2]; return 'not match'

我试着使用array_diff()进行比较,但有时结果不如预期,特别是如果数组2中有两个相同的值。

注意:数组2到数组8始终需要包含来自数组1的所有3个值。


1
请发布您已经尝试过的使用 array_diff 函数的代码。 - Ropali Munshi
6个回答

6

你只需要在比较之前对两个数组进行排序,例如:

sort($array1);
for ($i = 2; $i <= 8; $i++) {
    sort(${"array$i"});
    echo "array $i: " . ($array1 == ${"array$i"} ? 'match' : 'no match') . "\n";
}

输出:

array 2: match 
array 3: match 
array 4: match 
array 5: no match 
array 6: no match 
array 7: no match 
array 8: no match

Demo on 3v4l.org


1
感谢您的快速回复,但是如果像这样:$array1 = [7,6,7]; $array2 = [4,7,6];sort($array1); sort($array2); echo "array " . (empty(array_diff($array1, $array2)) ? 'match' : 'no match') . "\n";那么它会返回“array match”,而实际上不应该这样。 - vesuviuzzz
哇,这真的起作用了,我能知道为什么第一个不起作用而现在这个可以吗?是排序的魔力吗? - vesuviuzzz
1
第一段代码的问题在于array_diff只查看$array1中的所有值是否都在$array2中。在您的测试用例中,$array1中的值为6和7,这两个值都在$array2中,因此array_diff返回了一个空数组,看起来像是匹配成功了。我的新代码使用精确比较,因此数组必须具有相同数量的值,并且每个值都必须等于另一个数组中对应的值。请参见https://www.php.net/manual/en/language.operators.array.php。 - Nick

3
您可以使用array_unique()然后使用array_diff()来完成此任务:
$array1 = array_unique($array1);
$array2 = array_unique($array2);
$result = array_diff($array1, $array2);

array_unique() 函数的描述:

array_unique ( array $array [, int $sort_flags = SORT_STRING ] ) : array

array_unique — 从数组中移除重复的值

排序类型标志:

  • SORT_REGULAR - 正常比较项(不更改类型)
  • SORT_NUMERIC - 数字比较项
  • SORT_STRING - 字符串比较项
  • SORT_LOCALE_STRING - 基于当前区域设置将项作为字符串进行比较。

1
你需要对数组进行排序,以便进行索引比较。
将所有数组元素添加到父数组中。
循环遍历父数组。 sort()子数组。
进行比较,即可得出结果。
代码:
<?php
$array1 = [1,2,3]; 
$array2 = [3,2,1]; 
$array3 = [2,1,3]; 
$array4 = [2,1,3]; 
$array5 = [1,1,1]; 
$array6 = [3,3,2]; 
$array7 = [1,2,1];
$array8 = [8,9,2];


$arr['array_1'] = [1,2,3];
$arr['array_2'] = [3,2,1]; 
$arr['array_3'] = [2,1,3]; 
$arr['array_4'] = [2,1,3]; 
$arr['array_5'] = [1,1,1];
$arr['array_6'] = [3,3,2]; 
$arr['array_7'] = [1,2,1];
$arr['array_8'] = [8,9,2];

$find = [1,2,3];
if (! empty($arr)) {
 foreach ($arr as $key => $elem) {
  sort($arr[$key]);
  if ($arr[$key] == $find) {
   echo "<br/>[" . implode(',', $elem) . "]: Match";
  }
  else {
   echo "<br/>[" . implode(',', $elem) . "]: No Match";
  }
 }
}

输出:

[1,2,3]: Match
[3,2,1]: Match
[2,1,3]: Match
[2,1,3]: Match
[1,1,1]: No Match
[3,3,2]: No Match
[1,2,1]: No Match
[8,9,2]: No Match

1
尽管使用array_diff是可以的,但是有一种更简单的方法来比较两个数组,你只需要使用==
<?php

$array1 = [1,2,3]; 

$array2 = [3,2,1]; 
$array3 = [2,1,3]; 
$array4 = [2,1,3]; 
$array5 = [1,1,1]; 
$array6 = [3,3,2]; 
$array7 = [1,2,1];
$array8 = [8,9,2]; 


for($i = 2; $i <= 8; ++$i) {
    sort(${"array$i"});
    echo ${"array$i"} == $array1 ? 'match' : 'not match';
    echo PHP_EOL;
}

output:

match
match
match
not match
not match
not match
not match

PHP手册

$a == $b 相等性 如果$a和$b具有相同的键/值对,则为TRUE。

$a === $b 同一性 如果$a和$b按相同顺序且类型相同具有相同的键/值对,则为TRUE。


0
最快的方法是将数组转换为关联数组。你可以使用 array_flip 函数来实现。然后,你只需要检查键的差异,使用 array_diff_key 应该很快。例如:
$array1 = [1,2,3]; 
$array2 = [3,2,1]; 
$array3 = [2,1,3]; 
$array4 = [2,1,3]; 
$array5 = [1,1,1]; 
$array6 = [3,3,2]; 
$array7 = [1,2,1];
$array8 = [8,9,2]; 

var_dump(
  empty( // if it's empty then the arrays are identical
    array_diff_key(array_flip($array1), array_flip($array5))
  )
);

但是,如果您不关心任何数组是否包含重复值,则此方法将有效。如果元素的数量或顺序很重要,则此方法将无法正常工作。


0
首先需要使用 PHP 的 array_unique 函数从每个数组中减少重复数据, 然后使用 array_diff 函数来计算两个数组的差异。
<?php
    $firstArray = array_unique($firstArray);
    $secondArray = array_unique($secondArray);
    $arrayDiff = array_diff($firstArray, $secondArray);
?>

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