2017-01-13 101 views
0

我在PHP中有两个多维动态数组,像这样:比较动态多维数组

$old = array(
"meta_data" => array(
     "page_title" => "Test1", 
     "page_description" => "Test2", 
     "page_keywords" => "Test3" 
    ), 

"content" => array(
     "page_header_one" => "1", 
     "page_content_one" => "2", 
     "page_header_two" => "3", 
     "page_content_two" => "4", 
     "page_header_three" => "5" 
    ), 
); 

$new = array(
"meta_data" => array(
     "page_title" => "Test1", 
     "page_description" => "Test2", 
     "page_keywords" => "Test3324" 
    ), 

"content" => array(
     "page_header_one" => "124", 
     "page_content_one" => "243", 
     "page_header_two" => "343" 
    ), 
); 

我挣扎比较这些,因为他们是动态的,例如钥匙改变。我打算做的是比较数组,找出发生了什么变化,省略不匹配的键,并只将更改添加到新数组中。

唯一的东西,这将是不变的“meta_data”和$old“内容”

因此,例如,我们有内容数组中的5个项目,但$new数组中,我们只有3个项目(3变项目),所以新阵列将有3个内容项目。

有没有办法做到这一点我不能为我的生活弄清楚如何?

最终阵列应该像这样:

$final = array(
"meta_data" => array(
     "page_keywords" => "Test3324" 
    ), 

"content" => array(
     "page_header_one" => "124", 
     "page_content_one" => "243", 
     "page_header_two" => "343" 
    ), 
); 

回答

-1

您可以简单地使用PHP array_diff()功能。

$final = array_diff($new, $old); 
+0

你不能,导致数组来串转换。 – JPExDev

+0

您可以简单地将此过程与$ new ['meta_data']和$ new ['content']一起使用,而不是与阵列一起使用。 –

0

也许这是可以做到容易,但我认为这将做的工作:

<?php 
$newArray = []; 


foreach($old['meta_data'] as $key => $value) { 

    if(array_key_exists($key, $new['meta_data'])) { 
     if($new['meta_data'][$key] == $old['meta_data'][$key]) { 
      $newArray['meta_data'][$key] = $value; 
     } 
    } 

} 

foreach($old['content'] as $key => $value) { 

    if(array_key_exists($key, $new['content'])) { 
     if($new['content'][$key] == $old['content'][$key]) { 
      $newArray['content'][$key] = $value; 
     } 
    } 

} 

您也可以使顶端的按键动态的,所以内容和meta_data是动态的,以及像这样:

foreach($old as $topKey => $subArray) { 

    if(array_key_exists($topKey, $new)) { 
     foreach($subArray as $key => $value) { 
      if(array_key_exists($key, $new[$topKey])) { 
       if($new[$topKey][$key] == $old[$topKey][$key]) { 
        $newArray[$topKey][$key] = $value; 
       } 
      } 
     } 
    } 


} 

我还没有测试过它。但我认为你会得到这个主意。

0

唯一的东西,这将是不变的“meta_data”,并考虑这件事情记“内容”

解决您的问题是使用array_diff()功能如下:

$final = array(); 
$final['meta_data'] = array_diff($new['meta_data'], $old['meta_data']); 
$final['content'] = array_diff($new['content'], $old['content']); 

// display $final array 
var_dump($final); 

这里有一个live demo