替换多维嵌套数组中特定索引的值

时间:2020-06-25 10:19:22

标签: php arrays multidimensional-array

我有两个看起来像这样的数组

Array1

[
    "008feb2f-0361-4d94-8559-8ea5074d1c59" => [
        "2707bd40-d421-400d-ba55-694632facadd" => [],
        "307e97e0-be81-4644-b842-dcd23e88d09f" => []
    ],
    "86a11097-a9a7-4d84-8ffc-c9c382326f51" => []
]

Array2

[
    "c961c734-eae2-4fea-86bf-d543c57b0ab0" => [
        "008feb2f-0361-4d94-8559-8ea5074d1c59" => [],
        "86a11097-a9a7-4d84-8ffc-c9c382326f51" => []
    ],
    "651e505c-7e24-4646-8fe0-59b4ee58f078" => [],
    "eb4d76ca-f819-4828-95d3-777e0a4bf748" => []
]

数组2是父数组,即整个索引在任何索引的某个地方都是Array2的一部分。 我想替换Array2中等于Array1索引的索引值,例如:

008feb2f-0361-4d94-8559-8ea5074d1c59

86a11097-a9a7-4d84-8ffc-c9c382326f51

分别。

输出应该是一个看起来像这样的最终数组

[   
    "c961c734-eae2-4fea-86bf-d543c57b0ab0" => [
        "008feb2f-0361-4d94-8559-8ea5074d1c59" => [
            "2707bd40-d421-400d-ba55-694632facadd" => [],
            "307e97e0-be81-4644-b842-dcd23e88d09f" => []
        ],
        "86a11097-a9a7-4d84-8ffc-c9c382326f51" => []
    ],
    "651e505c-7e24-4646-8fe0-59b4ee58f078" => [],
    "eb4d76ca-f819-4828-95d3-777e0a4bf748" => []
]

我尝试通过以下方式使用

array_replace()

array_replace_recursive()

foreach() loop

但徒劳的是,子数组可以存在于任何地方,例如在数组内或数组或n个数组内。

2 个答案:

答案 0 :(得分:0)

您需要递归。然后,您将遇到array2中的每个键,并检查它是否与array1中的键匹配。匹配时,只需替换该键的值即可。我认为这些键总体上是唯一的。

这是您可以使用的功能:

function extend($array2, $array1) {
    if (!is_array($array2)) return $array2;
    foreach($array2 as $key => $value) {
        $array2[$key] = isset($array1[$key]) ? $array1[$key] : extend($value, $array1);
    }
    return $array2;
}

对于您的示例,请这样称呼:

$array1 = [
    "008feb2f-0361-4d94-8559-8ea5074d1c59" => [
        "2707bd40-d421-400d-ba55-694632facadd" => [],
        "307e97e0-be81-4644-b842-dcd23e88d09f" => []
    ],
    "86a11097-a9a7-4d84-8ffc-c9c382326f51" => []
];
    
$array2 = [
    "c961c734-eae2-4fea-86bf-d543c57b0ab0" => [
        "008feb2f-0361-4d94-8559-8ea5074d1c59" => [],
        "86a11097-a9a7-4d84-8ffc-c9c382326f51" => []
    ],
    "651e505c-7e24-4646-8fe0-59b4ee58f078" => [],
    "eb4d76ca-f819-4828-95d3-777e0a4bf748" => []
];

$result = extend($array2, $array1);
print_r($result);

答案 1 :(得分:0)

您可以先对数组进行展平,然后,只需按键即可查看展平的数组。

    function array_flatten($array) {
        $return = array();
        foreach ($array as $key => $value) {
            $return[$key] = $value;
            if (is_array($value)){
                $return = array_merge($return, array_flatten($value));
            }
        }
    
        return $return;
    }
    
    function get_hidratated_array($toHidratate, $master) {
        $result = [];
        foreach($toHidratate as $key=>$value ){
            if(isset($master[$key])) {
                $result[$key] = $master[$key];
            } else {
                $result[$key] = hidratate_array($value, $master);
            }
        }
        return $result;
    }
    
    $flat = array_flatten($array1);
    $result = get_hidratated_array($array2, $flat);
    print_r($result);