我var_dump
了两个数组,顶部是传入的数组,$new_array
,而另一个是预先存在的数组$current_array
:
// New Array
array(3) {
["Contributor"]=>
array(2) {
[0]=>
string(13) "edit_carousel"
[1]=>
string(13) "read_carousel"
}
["Editor"]=>
array(1) {
[0]=>
string(16) "delete_mini_feed"
}
["Author"]=>
array(3) {
[0]=>
string(11) "edit_blocks"
[1]=>
string(12) "edit_blockss"
[2]=>
string(12) "edit_blockss"
}
}
// Preexisting
array(3) {
["Contributor"]=>
array(2) {
[0]=>
string(13) "edit_carousel"
[1]=>
string(13) "read_carousel"
}
["Editor"]=>
array(4) {
[0]=>
string(16) "delete_mini_feed"
[1]=>
string(15) "edit_mini_feeds"
[2]=>
string(23) "edit_private_mini_feeds"
[3]=>
string(15) "edit_mini_feeds"
}
["Author"]=>
array(3) {
[0]=>
string(11) "edit_blocks"
[1]=>
string(12) "edit_blockss"
[2]=>
string(12) "edit_blockss"
}
}
我正在尝试做这样的事情:var_dump(array_intersect_assoc($current_array, $new_array));
查看当前数组与新数组的不同之处,并生成一个"差异"数组,保持结构完整。
问题是:
- 数组的顺序要比较正确吗? 比较旧与新,并获得旧与旧的不同之处的数组。 还是应该比较新与旧?
- 这样做会导致:数组到字符串的转换通知,但也打印出下面的数组。
我无法判断这些是:"这些不是旧的,而是新的"或"不是新的而是旧的"......(应该说:这些不是旧的,而是新的)。
array(3) {
["Contributor"]=>
array(2) {
[0]=>
string(13) "edit_carousel"
[1]=>
string(13) "read_carousel"
}
["Editor"]=>
array(4) {
[0]=>
string(16) "delete_mini_feed"
[1]=>
string(15) "edit_mini_feeds"
[2]=>
string(23) "edit_private_mini_feeds"
[3]=>
string(15) "edit_mini_feeds"
}
["Author"]=>
array(3) {
[0]=>
string(11) "edit_blocks"
[1]=>
string(12) "edit_blockss"
[2]=>
string(12) "edit_blockss"
}
}
php 函数 array_intersect_assoc() 应该返回第一个数组(又名 $current_array)中存在于第二个数组(又名 $new_array)中的所有内容。
您遇到的问题是 array_intersect_assoc() 不会递归地进行键比较。它只是比较第一级键(参与者、编辑者和作者)。
下面是有关递归问题的详细信息。PHP 问题:如何递归地array_intersect_assoc()
您的问题是您正在尝试对多维数组执行array_intersect
,但该函数对元素进行字符串比较,从而导致数组到字符串的转换错误。
由于您在两个数组中都有相同的键,最简单的解决方案就是foreach
并比较后续数组(如果您希望元素之间的差异,您宁愿需要array_diff
)
foreach($array_1 as $index => $sub_array) {
$sub_array_2 = $array_2[$index];
$diff = array_diff($sub_array, $sub_array_2);
// do something with diff
}
更新
如果你想得到所有不是array_1而是array_2
:$result = [];
# lets find if there's any new elements
$keys_1 = array_keys($array_1);
$keys_2 = array_keys($array_2);
$diff = array_diff($keys_1, $keys_2);
if(!empty($diff)) {
foreach($diff as $key) {
if(isset($array_2[$key])) {
# it's in array_2
$result[$key] = $array_2[$key];
}
}
}
# now get difference between shared elements
$intersection = array_intersect($keys_1, $keys_2);
foreach($intersection as $key) {
$element_1 = $array_1[$key];
$element_2 = $array_2[$key];
$diff = array_diff($element_1, $element_2);
if(sizeof($diff)) {
if(!isset($result[$key]) ||!is_array($result[$key]) ) {
$result[$key] = array($diff);
} else {
$result[$key][] = $diff;
}
}
}