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

时间:2013-11-13 22:09:34

标签: php arrays

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. 这样做会导致:数组到字符串转换通知,但也打印出一个下面的数组。
  3. 我不知道这些是不是:“这些不是旧的,而是新的”或“不是新的,而是旧的”......(应该说:这些不是旧的但是在新)。

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

2 个答案:

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