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

标签 php

<分区>

我试图将表单中的日期过滤为仅用户更改的内容,并开始使用 array_filter,因为它似乎完全符合我的要求。我测试了几种形式并遇到了这种意外行为。当"new"值为 1 时,array_diff 检测不到它。在 3v4l.org 上运行时,同样出乎意料的是,foreach 循环在返回预期结果时实际上比 array_filter 更快。我读过 man-page对于函数并了解它进行字符串比较,但所有数组值都是以字符串开头的,因此我不认为这是类型转换问题。

我已经解决了最初的问题,并且很乐意使用更快的 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)

最佳答案

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)  

如果您希望将 key 考虑在内,请改用 array_diff_assoc()

关于php - 为什么 PHP array_diff 以这种方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48509779/

相关文章:

javascript - 我可以在 PHP 中声明对象并将其传递给函数吗?

php - PDO 的 UPDATE 和 FETCHALL() 规则

javascript - jquery中如何知道ajax是否完成?

php - 在 PHP 中使用 UPDATE 命令的问题

php - SQLSTATE[HY000] [2002] 错误

php - 仅支持的密码是 AES-128-CBC 和 AES-256-CBC 错误

php - 查找大量文本数据的趋势

PHP/MySQL/HTML 添加用户错误?

php - WordPress 主题定制器内容未显示在页面上

java - GPRS远程打印机