2015-07-10 160 views
2

首先解釋我想要做的事情:我將數組作爲某人的家族樹。我帶兩個人,在我的mysql數據庫中根據信息創建他們的家族樹,然後我想檢查他們是否有任何家庭連接。像可以說personA的祖父可能是personB的曾祖父。瞭解家庭聯繫是否存在於其中,是非常重要的。我的意思是我必須知道,例如personA爺爺personB曾祖父。這將意味着連接位於陣列a 2級陣列和陣列b 3級陣列之間。在這種情況下,我必須知道這些數字和。在兩個多維數組中查找和定位多個值

所以我有兩個多維數組,名稱爲ab。我需要找出數組ab之間是否有多個值,並且如果有一些多個值,我必須找出它們位於數組a和數組b中的位置。


我的陣列看起來像這樣:

[0]=> array(4) { 
    ["id"]=> "1" 
    ["father"]=> [0]=> array(4) { 
        ["id"]=> "11" 
        ["father"]=> [0]=> array(4) { 
             ["id"]=> "111" 
             ["father"]=> "" 
             ["mother"]=> "" 
            } 
        ["mother"]=> [0]=> array(4) { 
             ["id"]=> "112" 
             ["father"]=> "" 
             ["mother"]=> "" 
            } 
       } 
    ["mother"]=> [0]=> array(4) { 
        ["id"]=> "12" 
        ["father"]=> [0]=> array(4) { 
             ["id"]=> "121" 
             ["father"]=> "" 
             ["mother"]=> "" 
            } 
        ["mother"]=> [0]=> array(4) { 
             ["id"]=> "122" 
             ["father"]=> "" 
             ["mother"]=> "" 
            } 
       } 
} 

所以,如果我有2個陣列像我向您展示了上面,我怎麼能檢查是否有在數組「A」的任何相同的價值觀和'b'?

+0

我認爲你在尋找這個:http://stackoverflow.com/questions/5653241/using-array-intersect-on-a-multi-dimensional-array –

+0

據我可以告訴'array_intersect'只會刪除一切,除非被檢查的人是兄弟姐妹和他們的樹是相同的。 –

回答

2

這裏的算法應該是:

  1. 計算使用array_intersect
  2. 樹木之間共享的每個ID每棵樹
  3. 相交的ID的集合中的所有的人的ID,發現它在每個圖和以某種方式報告。

我不知道如何報告共同的祖先,因此這裏是步驟1和2的實現。此外,我提供了一個函數來計算「路徑」到一個特定的ID;路徑是字母M或F的字符串,指定給定ID出現在祖先樹中的哪個位置。例如,MF意味着外祖父(母親的父親)。

function gather_ids($tree) { 
    if (!is_array($tree)) return array(); 
    return array_merge(array($tree["id"]), 
         gather_ids($tree["mother"]), 
         gather_ids($tree["father"])); 
} 

function common_ancestors($tree_a, $tree_b) { 
    return array_intersect(gather_ids($tree_a), gather_ids($tree_b)); 
} 

function ancestor_path_recursive($path, $tree, $id) { 
    if (!is_array($tree)) return NULL; 
    if ($tree["id"] == $id) return $path; 
    $p = path_to_id_recursive($path .. "M", $tree["mother"], $id); 
    if (!is_null($p)) return $p; 
    return path_to_id_recursive($path .. "F", $tree["father"], $id); 
} 

function ancestor_path($tree, $id) { 
    return ancestor_path_recursive("", $tree, $id); 
} 

請注意,此代碼是未經測試,但你應該得到的總體思路 - 這是很自然的遞歸處理您的陣列。