Рекурсивно добавить элемент в массив - PullRequest
0 голосов
/ 16 мая 2018

Мне нужно объединить эти два массива ($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',
            ),
        ),
    ),
);

Я ищу самый простой способ получить ожидаемый результат. Массивы могут иметь неизвестную структуру данных deph и могут иметь более одного индексированного подмассива. Кажется, мне нужно сочетание между array_merge_recursive и array_replace_recursive

Большое спасибо за ваши ответы:)

1 Ответ

0 голосов
/ 16 мая 2018

Сначала нужно немного подготовиться, чтобы отсеять этот нежелательный индексированный подмассив.

Код: ( Demo )

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...