首先要解释我想要做的事情:我将数组作为某个人的家谱。我带两个人,从我的mysql数据库中的信息制作他们的家谱,然后我想检查他们是否有任何家庭关系。就像让我们说personA
的祖父可能是personB
的曾祖父一样。了解家庭连接是否存在于哪个级别非常重要。我的意思是我必须知道,例如personA
祖父是personB
曾祖父。这意味着连接位于数组a
2级数组和数组b
3级数组之间。在这种情况下,我必须知道这些数字 2 和 3 。
所以我有两个名为a
和b
的多维数组。我需要找出数组a
和b
之间是否有任何多个值,如果有多个值,我必须找出它们在数组a
和数组{的位置{1}}。
我的数组看起来像这样:
b
因此,如果我有2个数组,就像我上面给出的那个,我怎样才能检查数组中是否有相同的值' a'和' b'?
答案 0 :(得分:2)
这里的算法应该是:
array_intersect
我不知道你想如何报告共同的祖先,所以这里是步骤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);
}
请注意,此代码未经测试,但您应该了解一般的想法 - 以递归方式处理数组非常自然。