考虑两个简单的数组:
<?php
$array1 = array(
'blue' => 5,
'green' => array(
'square' => 10,
'sphere' => 0.5,
'triangle' => 3
),
'red' => array(
'circle' => 1000,
),
'black' => 4,
);
$array2 = array(
'blue' => 1,
'green' => array(
'square' => 11,
'circle' => 5,
),
'purple' => 10,
'yellow' => array(
'triangle' => 4
),
'black' => array(
'circle' => 6,
),
);
我需要以递归方式将每个数组
$array1
和$array2
的值相加,并保留键。
- 保留键
- 如果一个键在
$array1
中不存在但存在于$array2
中,则最终数组仅包含$array2
的值(反之亦然) - 如果两个数组中都存在,则数字值将被相加
+
- 非数字值不会被修改
- 如果
$array1
中的值指向另一个子数组,在$array2
中它指向一个值,那么该键的结束值将包含一个子数组,其中包含来自$array1
的值以及使用父名称及其值的新键/值(请参阅示例中的black
) - 应能够在几乎无限的嵌套中工作
为了澄清,例如我们说
<?php
$final = array_merge_special($array1, $array2);
// We would end up with, if you var_export()'d final, something like:
// (Note: Hope I didn't make mistakes in this or it will be confusing,
// so expect mild human error)
$final = array(
'blue' => 6, // 5+1
'green' => array(
'square' => 21, // (10+11)
'sphere' => 0.5, // only in $array1
'triangle' => 3 // only in $array1
'circle' => 5, // only in $array2
),
'purple' => 10, // only in $array2
'yellow' => array( // only in $array2
'triangle' => 4
),
'red' => array( // only in $array1
'circle' => 1000,
),
'black' => array(
'circle' => 6, // untouched, while $black is present in both, the $array1 value does not have a 'circle' key, and is actually only a key/value (see below)
'black' => 4, // the key/value from $array1 that was not a subarray, even though it was a subarray in $array2
),
);
对我来说,这似乎非常令人生畏。 我知道我可以循环遍历一个数组并轻松地递归添加值,而且我已经做到了(有点),但是当涉及到特殊规则时(例如black
的规则),我甚至无法想象代码会有多糟糕。 必须有一种方法可以在单独循环遍历每个数组并使用unset()
合并值的情况下完成此操作。