Найти и добавить в ассоциативный массив в неизвестном многомерном массиве - PullRequest
2 голосов
/ 03 июня 2019

Я пытаюсь создать самостоятельное дерево, добавляя массивы в массивы. У меня проблемы с нахождением ассоциативного ключа в массиве и последующим добавлением в него нового содержимого (нового массива).

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 03 июня 2019

Это можно сделать рекурсивно.Вы можете найти ключ в массиве master и объединить это значение [s] с данными, которые вы хотите добавить / вставить.

Ниже я создал две функции, которые будут достигать этого.

/** Append or create to an array searching for the index with the with the value $key. If $key is set to null, append to array using numerical index.
 * @param array $masterArray Array to append to
 * @param mixed $data
 * @param null  $key         If not set, will append to the master array
 */
function append($key, $data, &$masterArray) {
    if($key===null) {
        $masterArray[] = $data;
    } else if(!_appendHelper($key, $data, $masterArray)) {
        $masterArray[$key] = $data;
    }
}

/** Helper function to recursively search/merge array */
function _appendHelper($key, $data, &$masterArray) {
    foreach($masterArray as $k => &$v) {
        if($k===$key) {
            $v = array_merge($v, is_array($data) ? $data : [$data]);
            return true;
        } elseif(is_array($v)) {
            _appendHelper($key, $data, $v);
        }
    }
    return false; // Key does not exist
}


$masterArray = ['foo' => ['bar' => ['ram' => ['ewe' => []]]], ['man' => ['chu' => []]]];

append('foo', ['__TEST1__' => [1, 1, 1]], $masterArray);
print_r($masterArray);

append('new_key', ['__TEST2__' => [2, 2, 2]], $masterArray);
print_r($masterArray);

append(null, ['__TEST3__' => [3, 3, 3]], $masterArray);
print_r($masterArray);
...