Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较PHP中的数组-顺序-字符串转换错误_Php_Arrays - Fatal编程技术网

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

比较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

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