0

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"
  }
}
4

2 回答 2

0

php 函数 array_intersect_assoc() 应该返回存在于第二个数组(又名 $new_array)中的第一个数组(又名 $current_array)中的所有内容。

您遇到的问题是 array_intersect_assoc() 不会递归地执行键比较。它只是比较第一级键(贡献者、编辑和作者)。

这是有关递归问题的更多信息。PHP问题:如何递归地array_intersect_assoc()

于 2013-11-13T22:17:03.943 回答
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;
    }
  }
}
于 2013-11-13T22:18:39.173 回答