为什么PHP array_diff以这种方式工作

时间:2018-01-29 20:53:06

标签: php

我试图将日期从表单过滤到用户已更改的内容,并开始使用array_filter,因为它似乎正是我想要的。我测试了几种形式并遇到了这种意外行为。当&#34;新&#34;值为1,array_diff未检测到。在3v4l.org上运行时也出乎意料的是,在返回预期结果时,foreach循环实际上比array_filter更快。我已经阅读了man-page函数,并了解它是否进行字符串比较,但所有数组值都是字符串开头,所以我不希望它是类型转换问题。< / p>

我已经解决了我的初始问题,很乐意使用更快的foreach循环,但我很感兴趣,如果有人能解释为什么这样做会这样。

https://3v4l.org/1JggJ

<?php

$array_1 = [
    'id' => '42',
    'base_id' => '23',
    'role_id' => '1',
    'title' => 'Manage Account',
    'slug' => 'manage_account',
    'parent' => '31',
    'order' => '1',
    'visibility' => '1'
];
$array_2 = [
    'id' => '42',
    'base_id' => '23',
    'role_id' => '99999',
    'title' => 'Manage Account',
    'slug' => 'manage_account',
    'parent' => '31',
    'order' => '1',
    'visibility' => '1'
];

var_dump(array_diff($array_1, $array_2));
// Result (unexpected)
// array (size=0)
//   empty        

$diff = [];
foreach ($array_1 as $key => $value) {
    if ((string) $array_1[$key] !== (string) $array_2[$key]) {
        $diff[$key] = $value;
    }
}

var_dump($diff);
// Result (expected)
// array (size=1)
//   'role_id' => string '1' (length=1)

1 个答案:

答案 0 :(得分:5)

array_diff()查找数组2中数组1的每个值的精确重复项,忽略键。

1在数组2中有重复,例如在关键order下。这就是为什么它没有被列为差异的原因。

这种行为是否最佳或显而易见是有争议的,但这是如何运作的。

如果您将1更改为3,则会报告,因为数组2不包含值3

    $array_1 = [
        'id' => '42',
        'base_id' => '23',
        'role_id' => '3',
        'title' => 'Manage Account',
        'slug' => 'manage_account',
        'parent' => '31',
        'order' => '1',
        'visibility' => '1'
    ];
    $array_2 = [
        'id' => '42',
        'base_id' => '23',
        'role_id' => '99999',
        'title' => 'Manage Account',
        'slug' => 'manage_account',
        'parent' => '31',
        'order' => '1',
        'visibility' => '1'
    ];

    var_dump(array_diff($array_1, $array_2));
    // Result (unexpected)
    // array (size=1)
    //   'role_id' => string '3' (length=1)  

如果您想要考虑密钥,请改用array_diff_assoc()