在两个多维数组中查找和定位多个值

时间:2015-07-10 07:13:08

标签: php mysql arrays multidimensional-array

首先要解释我想要做的事情:我将数组作为某个人的家谱。我带两个人,从我的mysql数据库中的信息制作他们的家谱,然后我想检查他们是否有任何家庭关系。就像让我们说personA的祖父可能是personB的曾祖父一样。了解家庭连接是否存在于哪个级别非常重要。我的意思是我必须知道,例如personA 祖父personB 曾祖父。这意味着连接位于数组a 2级数组和数组b 3级数组之间。在这种情况下,我必须知道这些数字 2 3

所以我有两个名为ab的多维数组。我需要找出数组ab之间是否有任何多个值,如果有多个值,我必须找出它们在数组a和数组{的位置{1}}。

我的数组看起来像这样:

b

因此,如果我有2个数组,就像我上面给出的那个,我怎样才能检查数组中是否有相同的值' a'和' b'?

1 个答案:

答案 0 :(得分:2)

这里的算法应该是:

  1. 计算每棵树中所有人员ID的集合
  2. 使用array_intersect
  3. 对ID进行相交
  4. 对于树之间共享的每个ID,在每个图中找到它并以某种方式报告。
  5. 我不知道你想如何报告共同的祖先,所以这里是步骤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);
    }
    

    请注意,此代码未经测试,但您应该了解一般的想法 - 以递归方式处理数组非常自然。