首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当键相同时,查找多维数组中的数组差异

当键相同时,查找多维数组中的数组差异
EN

Stack Overflow用户
提问于 2018-04-05 11:08:51
回答 3查看 524关注 0票数 1

当键值相同时,我想找出两个多维数组之间的区别。我已经尝试过每一件事,也尝试过这么多的堆栈溢出解决方案,但是我做不到。

阵列1 (DbData) :-

代码语言:javascript
复制
$ajaxData = array("phase-5[]" =>
    array(
        '1' => "Admin Phase 1 Task 1",
        '2' => "Admin Phase 1 Task 2" 
    ),"phase-6[]" =>
    array(
        '1' => "Admin Phase 2 Task 1", 
        '2' => "Admin Phase 2 Task 2",
        '3' => "Admin Phase 2 Task 3" 
    ),"phase-7[]" =>
    array( 
        '1' => "Admin Phase 3 Task 1", 
        '2' => "Admin Phase 3 Task 2",
        '3' => "Admin Phase 3 Task 3"
    )
);

数组2 (AjaxData) :-

代码语言:javascript
复制
$dbData = array("phase-5[]" =>
    array(
        '0' => "Admin Phase 1 Task 1", 
        '1' => "Admin Phase 1 Task 2"
    ),"phase-6[]" =>
    array(
        '0' => "Admin Phase 2 Task 1",
        '1' => "Admin Phase 2 Task 2"
    ),"phase-7[]" =>
    array(
        '0' => "Admin Phase 3 Task 1",
        '1' => "Admin Phase 3 Task 2" 
    )
);

PHP代码:-

代码语言:javascript
复制
$ajaxDataList = array();
foreach ($ajaxData as $key => $value) {
    print_r($key);
    foreach ($value as $data) {
        $ajaxDataList[] = $data;
    }
}

$dbDataList = array();
foreach ($dbData as $key => $value) {
    print_r($key);
    foreach ($value as $data) {
        $dbDataList[] = $data;
    }
}
var_dump(array_diff($ajaxDataList, $dbDataList));

代码中的O/P :-

代码语言:javascript
复制
 array (size=2)
  4 => string 'Admin Phase 2 Task 3' (length=20)
  7 => string 'Admin Phase 3 Task 3' (length=20)

我能够找到两个数组之间的区别,但我无法找到与键的区别。,我只需要在这里添加键。但我做不到。

我需要这样的结构,

代码语言:javascript
复制
array (size=2)
  'phase-6[]' => string 'Admin Phase 2 Task 3' (length=20)
  'phase-7[]' => string 'Admin Phase 3 Task 3' (length=20)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-05 11:20:08

轻松解决方案与小改动

1.您需要在2/代码中向每个数组的所有值中添加一些唯一字符的键(我使用了foreach() )。

2.在得到差异后,在这个数组上迭代并使用一个独特的字符(我使用了/),然后使用第一部分作为键,第二部分作为值,然后将它们赋值给最终的结果数组。

如下所示:-

代码语言:javascript
复制
$ajaxDataList = array();
foreach ($ajaxData as $key => $value) {
    foreach ($value as $data) {
        $ajaxDataList[] = $key.'/'.$data; //add key with each value
    }
}

$dbDataList = array();
foreach ($dbData as $key => $value) {
    foreach ($value as $data) {
        $dbDataList[] = $key.'/'.$data; // add key with each value
    }
}
$semi_final_array = array_diff($ajaxDataList, $dbDataList);

$final_array = [];

foreach($semi_final_array as $arr){ // iterate over difference array
   $exploded = explode('/',$arr); //explode data
   $final_array[$exploded[0]] = $exploded[1]; // use exploded array as key value pair
}

print_r($final_array);

输出:-https://eval.in/984265

票数 1
EN

Stack Overflow用户

发布于 2018-04-05 11:33:45

编写递归函数。

注释:您的子数组键必须是相同的,在第一个数组中,子数组键从1开始,但是在第二个数组中,它从0开始。如果你能让它保持不变,这个函数就能工作了。

参考文献:http://php.net/manual/en/function.array-diff-assoc.php#73972

代码语言:javascript
复制
function array_diff_assoc_recursive($array1, $array2)
{
    foreach($array1 as $key => $value)
    {
        if(is_array($value))
        {
              if(!isset($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              elseif(!is_array($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              else
              {
                  $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                  if($new_diff != FALSE)
                  {
                        $difference[$key] = $new_diff;
                  }
              }
          }
          elseif(!isset($array2[$key]) || $array2[$key] != $value)
          {
              $difference[$key] = $value;
          }
    }
    return !isset($difference) ? 0 : $difference;
} 

var_dump( array_diff_assoc_recursive(  $ajaxData, $dbData) );

演示

票数 1
EN

Stack Overflow用户

发布于 2018-04-05 11:37:12

您需要循环这两个数组并相互比较。

否则,如果一个子数组存在于一个数组中,而不存在另一个数组中,则不会注意到其中的差异。

代码语言:javascript
复制
//Loop once first array and compare against the other
Foreach($ajaxData as $key => $arr){
    If(isset($dbData[$key])){
        $ret[] = array_diff($arr, $dbData[$key]);
    }else{
        // If subarray only exists in one array add it to return array
        $ret[] = $arr;
    }
}
// Then the other way around
Foreach($dbData as $key => $arr){
    If(isset($ajaxData[$key])){
        If(!isset($ret[$key])) $ret[$key] = array_diff($arr, $ajaxData[$key]);
    }else{
        // If subarray only exists in one array add it to return array
        $ret[] = $arr;
    }
}

// echo found diff's.
Foreach($ret as $key => $val){
    If(is_array($val)){
        Foreach($val as $v){
            Echo $key ." " . $v . "\n";
        }
    }
}

https://3v4l.org/ZVc00

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49670902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档