比较PHP中的数组-顺序-字符串转换错误
I比较PHP中的数组-顺序-字符串转换错误,php,arrays,Php,Arrays,Ivar\u dump编辑了两个数组,顶部是即将进入的数组,$new\u array,而另一个是预先存在的数组$current\u array: // New Array array(3) { ["Contributor"]=> array(2) { [0]=> string(13) "edit_carousel" [1]=> string(13) "read_carousel" } ["Editor"]=> array
var\u dump
编辑了两个数组,顶部是即将进入的数组,$new\u array
,而另一个是预先存在的数组$current\u 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\u dump(array\u intersect\u assoc($current\u array,$new\u array))
查看当前数组与新数组的不同之处,并生成一个保持结构完整的“差异”数组
问题是:
php函数array_intersect_assoc()应该返回第一个数组(aka$current_数组)中存在于第二个数组(aka$new_数组)中的所有内容 您遇到的问题是数组_intersect_assoc()不会递归地执行键比较。它只是比较第一级键(Contributor、Editor和Author)
下面是有关递归问题的更多信息 您的问题是,您试图在多维数组上执行
array\u intersect
,但该函数对元素进行字符串比较,从而导致数组到字符串的转换错误
由于两个数组中的键相同,最简单的解决方案就是通过foreach
并比较后续数组(如果希望元素之间存在差异,则需要array_diff
)
更新
如果要获取数组_1中不包含但数组_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;
}
}
}
如果我没有相同的钥匙呢?你的解决方案仍然有效吗?例如,如果
$new\u array
中的Contributor
更改为Contributor\u 2
@baldrsy您仍然可以在仅键之间进行diff,如下所示:$diff=array_diff(array_键($array1),array_键($array2))代码>如果按键有任何差异,我的答案中的代码没有任何意义。那么我的顺序正确吗?我想要——新数组中的所有东西,而不是当前数组中的所有东西都要返回。首先,它不会返回你想要的东西,因为你使用的是多维数组。但是,如果它们都是一维的,则使用数组_intersect_assoc()将返回公共项。如果你想返回差异(即当前值和非新值),你可以使用array\u diff\u assoc($current\u array,$new\u array)。然后我会进行关联,因为多个维度不可能一蹴而就数组_diff_assoc,也就是说,一种方法是将维度展平。使用数组差异($current_array['Contributor'],$new_array['Contributor']);例如。但是,你的最终目标是什么。您是否只想知道系统用户从每个用户类型中删除了哪些设置?
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
}
$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;
}
}
}