<分区>
我试图将表单中的日期过滤为仅用户更改的内容,并开始使用 array_filter
,因为它似乎完全符合我的要求。我测试了几种形式并遇到了这种意外行为。当"new"值为 1 时,array_diff
检测不到它。在 3v4l.org 上运行时,同样出乎意料的是,foreach 循环在返回预期结果时实际上比 array_filter
更快。我读过 man-page对于函数并了解它进行字符串比较,但所有数组值都是以字符串开头的,因此我不认为这是类型转换问题。
我已经解决了最初的问题,并且很乐意使用更快的 foreach 循环,但我很想知道是否有人可以解释为什么会这样。
<?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)