Изменение элемента в многомерном массиве разной рамерностью?

Здравствуйте!

имеется массив:
$GLOBAL= [
    3515 => [
        'sub_categories' => [
            22916 => [
            'sub_categories' => [
                33221 => 'test'
            ]
            ],
        ]
    ],
    35215 => [
        'sub_categories' => [
            221916 => 'test2'
        ]
    ],
];


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

Написать что-то типа
$GLOBAL[3515]["sub_categories"][22916]["sub_categories"][22920]["sub_categories"] = [ 3333 => 'test3']

Естественно не подходит, т.к. у меня все динамически и путь и размерность заранее неизвестны.

У меня есть поиск по ключу
function searchArr($array, $key, $value)
{
    $results = array();
    if (is_array($array)) {
        if (isset($array[$key]) && $array[$key] == $value) {
            $results = $array;
        }
        foreach ($array as $subarray) {
            $results = array_merge($results, searchArr($subarray, $key, $value));
        }
    }
    return $results;
}

Находит он замечательно, но возвращает массив, а мне необходимо ссылку на этот элемент чтобы потом модифицировать в массиве $GLOBAL.

Пытался даже в строку путь, но потом не сообразил как применять его и eval
// заранее известный путь из некоторых ключей
$path = '3515.22916.22920.25109.30158';
$parents = explode(".",$path); 
foreach($parents as $parent_id){
    $s .= '['.$parent_id.'][\'sub_categories\']';
}

echo  $s; // [3515]['sub_categories'][22916]['sub_categories'][22920]['sub_categories'][25109]['sub_categories'][30158]['sub_categories']

// Как обратится к масcиву $GLOBALтак и не понял
$c =  eval($s);


Что-то искал вчера целый день, построение ссылки на нужный элемент массива, узнать родителя массива, ничего подобного не нашел. Уже мысль была про кучу вложенных foreach, но это не комильфо.

Подскажите пожалуйста как изменять элементы не зная заранее путь
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
Рекурсия в помощь.
function r_array_search($needle, $haystack, $currentKey = "") {
    foreach ($haystack as $key => $value) {
        if (is_array($value)) {
            $nextKey = r_array_search($needle, $value, $currentKey . "[{$key}]");            
            if ($nextKey) {
                return $nextKey;
            }
        } else if ($value == $needle) {
            return is_numeric($key) ? $currentKey . "[{$key}]" : $currentKey . "['{$key}']";
        }
    }
    return false;
}

$GLOBAL = [
    3515 => [
        'sub_categories' => [
            22916 => [
                'sub_categories' => [
                    33221 => 'test'
                ]
            ],
        ]
    ],
    35215 => [
        'sub_categories' => [
            221916 => 'test2'
        ]
    ],
];

print_r(r_array_search("test", $GLOBAL));

//[3515][sub_categories][22916][sub_categories][33221]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы