递归地向数组中添加元素

3
我需要合并这两个数组($array2$array1):
$array1 = array(
    'data' => array(
        array(
            'raw' => array(
                'key1' => array('value1', 'value1_1'),
                'key3' => 'value3',
            ),
        ),
        array(
            'raw' => array(
                'key1' => array('value10', 'value10_1'),
                'key3' => 'value30',
            ),
        ),
        ...
    ),
);

$array2 = array(
    'data' => array(
       array(
           'raw' => array(
               'key1' => 'value1_2',
               'key2' => 'value2',
           )
       )
    )
);

预期结果:

array(
    'data' => array(
        array(
            'raw' => array(
                'key1' => array('value1', 'value1_1', 'value1_2'),
                'key2' => 'value2',
                'key3' => 'value3',
            ),
        ),
        array(
            'raw' => array(
                'key1' => array('value10', 'value10_1'),
                'key3' => 'value30',
            ),
        ),
    ),
);

当我使用array_merge_recursive$array2合并到$array1['data'][0]中时,我得到了以下结果:
$array1 = array(
    'data' => array(
        array(
            'raw' => array(
                'key1' => array('value1', 'value1_1'),
                'key3' => 'value3',
            ),
        ),
        array(
            'raw' => array(
                'key1' => array('value10', 'value10_1'),
                'key3' => 'value30',
            ),
        ),
        array(
           'raw' => array(
               'key1' => 'value1_2',
               'key2' => 'value2',
           )
       )
    ),
);

当我使用array_replace_recursive时,我得到了以下结果:

$array1 = array(
    'data' => array(
        array(
            'raw' => array(
                'key1' => 'value1_2',
                'key2' => 'value2',
                'key3' => 'value3',
            ),
        ),
        array(
            'raw' => array(
                'key1' => array('value10', 'value10_1'),
                'key3' => 'value30',
            ),
        ),
    ),
);

我正在寻找最简单的方法来获得期望的结果。数组可以具有未知深度的数据结构,并且可以具有多个索引子数组。似乎我需要在array_merge_recursivearray_replace_recursive之间进行组合。
感谢您的回答 :)

1
你是否_需要_递归?你的数据结构深度未知吗?data子数组可能有多个索引子数组吗?如果没有,那么我认为你应该改变你的结构。...索引数组有时会真的搞砸事情。 - mickmackusa
1
是的,这是一个未知深度的数据结构。实际上,数组可以有多个索引子数组......我会编辑我的答案更加明确。 - Brah0um
请提供样例输入以阐明数据的复杂性。同时,发布您的实际/完整/最佳编码尝试,以避免被关闭为“过于宽泛”。 - mickmackusa
我编辑了我的回答。如果你需要更多信息,请告诉我。非常感谢 :-) - Brah0um
1个回答

2

首先需要一些准备工作,以清除不需要的索引子数组。

代码:(演示)

$array1['data']=current($array1['data']); // repair
$array2['data']=current($array2['data']); // repair
var_export(array_merge_recursive($array1, $array2));  // merge as intended

输出:

array (
  'data' => 
  array (
    'raw' => 
    array (
      'key1' => 
      array (
        0 => 'value1',
        1 => 'value1_1',
        2 => 'value1_2',
      ),
      'key3' => 'value3',
      'key2' => 'value2',
    ),
  ),
)

将问题更新以表达更复杂的数据结构...

代码: (演示)

foreach ($array1['data'] as $set) {
    foreach ($set['raw'] as $k => $v) {
        if (!isset($result['data']['raw'][$k])) {
            $result['data']['raw'][$k] = $v;
        }else {
            $result['data']['raw'][$k] = array_merge((array)$result['data']['raw'][$k],(array)$v);
        }
    }
}
foreach ($array2['data'] as $set) {
    foreach ($set['raw'] as $k => $v) {
        if (!isset($result['data']['raw'][$k])) {
            $result['data']['raw'][$k] = $v;
        }else{
            $result['data']['raw'][$k] = array_merge((array)$result['data']['raw'][$k],(array)$v);
        }
    }
}
var_export($result);

这只对特定的样本数据有效,我怀疑答案应该更加健壮。 - zedling
1
当然。我希望原帖的作者能够澄清。我只能根据提供的信息构建解决方案。否则,这将是一堆可能性和边缘情况的兔子洞。 - mickmackusa
@BwaBwa,请在您现有的项目数据上检查我的新片段,并告诉我它是否有问题。如果有问题,请提供一个最小的输入数组,以便我可以再试一次。 - mickmackusa
@mickmackusa 哇,它按预期工作了!我知道这不会简单。非常感谢!如果我找到更简单的方法,我会编辑您的答案 :) - Brah0um

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接