我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"
}
}
答案 0 :(得分:0)
php函数array_intersect_assoc()应返回第二个数组(又名$ new_array)中存在的第一个数组(又名$ current_array)中的所有内容。
您遇到的问题是array_intersect_assoc()不会递归地执行密钥比较。它只是比较第一级键(贡献者,编辑和作者)。
以下是有关递归问题的更多信息。 PHP Question: how to array_intersect_assoc() recursively
答案 1 :(得分:0)
您的问题是您尝试在多维数组上执行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;
}
}
}