2017-01-13 172 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