【问题标题】:Finding and locating multiple values in two multidimensional arrays在两个多维数组中查找和定位多个值
【发布时间】:2015-09-28 20:14:05
【问题描述】:

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

所以我有两个名为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' 中是否有相同的值?

【问题讨论】:

标签: php mysql arrays multidimensional-array


【解决方案1】:

这里的算法应该是:

  1. 计算每棵树中所有人员 ID 的集合
  2. 使用array_intersect 将 ID 相交
  3. 对于树之间共享的每个 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);
}

请注意,此代码未经测试,但您应该了解总体思路 - 递归处理数组是很自然的。

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 2021-04-12
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多