PHP array_diff bug?

时间:2016-08-30 08:49:59

标签: php arrays

PHP documentation明确说明

  

将array1与一个或多个其他数组进行比较,并返回array1中任何其他数组中不存在的

情况似乎并非如此。采取以下示例

$a = array(1,2,3,4);
$b = array(3,4,5);
echo "b FROM a = ";
echo json_encode(array_diff($a,$b));
echo "<br>a FROM b = ";
echo json_encode(array_diff($b,$a));

返回

b FROM a = [1,2]
a FROM b = {"2":5}

即。一个案例中的普通数组和另一个案例中的关联数组。容易修复 - 我只关心价值观,所以我可以简单地做array_values(array_diff。然而,令我困扰的是文档掩盖了这种差异。也许这里有人可以更多地了解正在发生的事情?

1 个答案:

答案 0 :(得分:3)

不是PHP做任何魔术,它是json

array_diff()维护键/关联性

b from a返回

array(
    0 => 1
    1 => 2
)

a from b返回

array(
    2 => 5
)

当你转换为json时,如果json的数字从0开始增加并且递增1,json就不会为这些键而烦恼,因此json会忽略来自b from a的键,因为它们匹配标准

但是,a from b结果中的键不会自然地从0开始递增,因此它们存储在json中

如果您不想保持关键关联,请使用

echo json_encode(array_values(array_diff($b,$a)));

将键重置为自然递增