一个数组的数组差异问题包含空值,其他值为空

时间:2018-09-12 20:35:43

标签: php laravel laravel-5

我正在使用laravel。我有2个数组。例如

$array1 = [
    'test1',
    '',
    'test2',
    'test3',
    '',
    'test4',
    '',
];

$array2 = [
    null
];

dd(array_diff($array1, $array2));

结果是

array:4 [▼
  0 => "test1"
  2 => "test2"
  3 => "test3"
  5 => "test4"
]

但我期望

array:7 [▼
  0 => "test1"
  1 => ""
  2 => "test2"
  3 => "test3"
  4 => ""
  5 => "test4"
  6 => ""
]

您能问为什么在array_diff中认为null is equal '',以及如何在没有任何额外编码的情况下解决该问题。现在我解决了

foreach ($array1 as $key => $value) {
    if (in_array($value, $array2, true)) {
        unset($array1[$key]);
    }
}

3 个答案:

答案 0 :(得分:2)

写在manual中:

  

当且仅当(string)$ elem1 ===(string)$ elem2,两个元素才被视为相等。换句话说:当字符串表示相同时。

因此,您的null值被强制转换为空字符串,这就是为什么要获得结果的原因。因此,没有其他代码就无法解决您的任务。

答案 1 :(得分:1)

要添加到所说的内容中,您可以轻松地将其过滤掉

$array2 = array_filter($array2, function($v){
    return !is_null($v);
});

答案 2 :(得分:0)

您可以使用array_udiff代替array_diff。

array_udiff($array1, $array2, function ($a, $b) { return $a !== $b; })