PHP数组如何检查所有数组值是否存在于其他数组中

时间:2019-04-01 12:23:47

标签: php arrays

我有类似这样的数组:

$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()进行比较,但有时结果不符合我的预期,尤其是在array2上具有两个相同值的情况下。

注意:array2直到array8必须始终具有array1的所有3个值

6 个答案:

答案 0 :(得分:7)

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

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 :(得分: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-根据当前语言环境将项目作为字符串进行比较。

答案 2 :(得分: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

答案 3 :(得分: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;
}

输出:

match
match
match
not match
not match
not match
not match

PHP MANUAL

  

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

     

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

答案 4 :(得分: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))
  )
);

但这仅在您不关心任何数组是否包含重复值的情况下才有效。如果元素的数量或顺序很重要,那么这将无效。

答案 5 :(得分:0)

首先需要使用php array_unique 函数减少每个数组中的重复数据 然后使用 array_diff 函数

区分两个数组
<?php
    $firstArray = array_unique($firstArray);
    $secondArray = array_unique($secondArray);
    $arrayDiff = array_diff($firstArray, $secondArray);
?>