2014-03-12 20 views
4

我一直在努力應對現在應該是一個非常簡單的問題,並且無法找到答案。使用array_diff_assoc()或獲得多維數組的差異

我有兩個陣列和這些陣列包含有關ID,LinkLabel的和url的格式如下信息:

$pageids 
-------- 
Array ( 
[0] => Array 
([id] => 1 
    [linklabel] => Home 
    [url] => home) 

[1] => Array 
([id] => 2 
    [linklabel] => Graphic Design 
    [url] => graphicdesign) 

[2] => Array 
([id] => 3 
    [linklabel] => Other Design 
    [url] => otherdesign) 

[3] => Array 
([id] => 6 
    [linklabel] => Logo Design 
    [url] => logodesign) 

[4] => Array 
([id] => 15 
    [linklabel] => Content Writing 
    [url] => contentwriting) 
) 


$parentpage 
----------- 
Array ( 
[0] => Array 
([id] => 2 
    [linklabel] => Graphic Design 
    [url] => graphicdesign) 

[1] => Array 
([id] => 3 
    [linklabel] => Other Design 
    [url] => otherdesign)) 

現在我想這兩個爲了比較發現,在$pageids信息但不在$parentpage - 這將構成另一個名爲$pageWithNoChildren的數組。然而,當我使用以下代碼:

$pageWithNoChildren = array_diff_assoc($pageids,$parentpage); 

在陣列上的所述第一電平的array_diff_assoc()運行,並因此認爲,這兩個$pageids$parentpages具有[0]和[1]鍵,因此忽略它們並返回所有從[2]開始的$pageids的信息。不過,我希望它查看嵌套數組的內容並比較這些內容我需要它看到哪個id,linklabel和url在$pageids而不在$parentpages並返回這些值。

如何讓array_diff_assoc()在嵌套數組的鍵上運行,而不是第一個數組的鍵,因此最終結果是一個包含[0],[3]和[4]內容的數組]數組從$pageids

回答

9

要檢查多deminsions嘗試是這樣的:

$pageWithNoChildren = array_map('unserialize', 
    array_diff(array_map('serialize', $pageids), array_map('serialize', $parentpage))); 
  • array_map()貫穿serialize()
  • serialize()主陣列的每個子陣列的每個子陣列轉換成的一個字符串表示子陣列
  • 現在主陣列的值不是數組,而是子陣列的字符串表示形式
  • array_diff()現在具有用於每個所述陣列的一維陣列進行比較
  • 的差是通過unserialize()返回array_map()運行陣列結果(差)之後打開字符串表示回子陣列

QED

+0

這太棒了!謝謝!順便說一句,我不認爲你可以對此做出快速解釋嗎?我之前沒有使用過反序列化或array_maps,現在我正在查找它們,但是如果你能快速運行,那將是驚人的,不管怎樣,再次感謝! – Smokescreen

+0

我想我可能已經找到了答案,所以其他人閱讀這個和誰是好奇我相信serialize()將PHP鍵和值轉換爲一個字符串,所以你有所有的$ pageids數組中的字符串和所有的字符串$ parentpages的數組。然後,array_diff函數可以比較這些字符串,並挑出那些在$ pageids中而不在$ parentpages中的字符串,然後使用unserialize()將結果轉換回php vales。正是我需要的!再次感謝!:) – Smokescreen

+0

謝謝!我剛剛一步一步地閱讀了你的文檔,還發現了一些文檔,你所說的幾乎是我從閱讀中理解的東西,所以它看起來像我已經知道了:)再次感謝,這真是太棒了! – Smokescreen

0

來自@AbraCadaver的非常好的解決方案,但就像我在評論中指出的那樣,可能會出現這樣的情況,即關聯數組的元素在各處都不是相同的順序,因此這是一個自定義函數,它將按索引/關鍵首先是方便:

function sortAndSerialize($arr){ 
    ksort($arr); 
    return serialize($arr); 
} 

array_map('unserialize', array_diff(array_map('sortAndSerialize', $pageids), array_map('sortAndSerialize', $parentpage)));