Задать вопрос
@kossin17

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

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

имеется массив:
$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, но это не комильфо.

Подскажите пожалуйста как изменять элементы не зная заранее путь
  • Вопрос задан
  • 91 просмотр
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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]
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы