比较 PHP 中的数组 - 顺序 - 字符串转换错误


Comparing arrays in PHP - which order - string conversion errors

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));查看当前数组与新数组的不同之处,并生成一个"差异"数组,保持结构完整。

问题是:

  1. 数组的顺序要比较正确吗? 比较旧与新,并获得旧与旧的不同之处的数组。 还是应该比较新与旧?
  2. 这样做会导致:数组到字符串的转换通知,但也打印出下面的数组。

我无法判断这些是:"这些不是旧的,而是新的"或"不是新的而是旧的"......(应该说:这些不是旧的,而是新的)。

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;
    }
  }
}