@Shimpanze

Как работает рекурсивная функция?

Не могу понять как использовать данную рекурсивную функцию с функцией обратного вызова. Объясните, пожалуйста, доступно.

Сама универсальная функция (опубликована на php.net):

function array_walk_recursive_array(array &$array, callable $callback) {
    foreach ($array as $k => &$v) {
        if (is_array($v)) {
            array_walk_recursive_array($v, $callback);
        } else {
            $callback($v, $k, $array);
        }
    }
}


Массив:

$array = [
    ['foo'],
    ['bar'],
    'baz'
];


Массив, который я хочу получить на выходе (если очередной элемент в цикле это массив, то добавить к нему 'a' => 'b'):

$array = [
    [
        'foo',
        'a' => 'b'
    ],
    [
        'bar',
        'a' => 'b'
    ],
    'baz'
];


Моё использование вышеприведённой функции:

array_walk_recursive_array( $array, function( $v, $k, $array ) {
    if ( is_array( $v ) ) {
        $v = $v['a'] = 'b';
        return $v;
    }
    else return $v;
});


Но массив не изменяется. Как её правильно использовать?
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
rpsv
@rpsv
делай либо хорошо, либо никак
У вас внутри есть такое условие:
if (is_array($v)) {
            array_walk_recursive_array($v, $callback);


Т.е. в колбэк ни при каких условиях массив не попадет, поэтому у вас и не отрабатывает дальнейшие условие по проверке массива, т.к. у вас функция бегает по всей глубине массива. Уберите условие в вашей функции и будет ок:
function array_walk_recursive_array(array &$array, callable $callback) {
    foreach ($array as $k => &$v) {
        // if (is_array($v)) {
        //     array_walk_recursive_array($v, $callback);
        // } else {
            $callback(& $v, $k, $array);
        // }
    }
}

array_walk_recursive_array( $array, function( $v, $k, $array ) {
    if ( is_array( $v ) ) {
        $v = $v['a'] = 'b';
        return $v;
    }
    else return $v;
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
irishmann
@irishmann
Научись пользоваться дебаггером
Мне кажется ты изобретаешь велосипед. array_walk_recursive() посмотри документацию, там довольно понятно расписано как использовать. А то что ты пишешь - пародия на эту функцию. Первый аргумент - массив, вторым должна быть твоя функция, которая делает то что тебе нужно для каждого элемента массива.

UPD. Посидел подумал, в твоем случае,
чтобы из этого
$array = [
    ['foo'],
    ['bar'],
    'baz'
];

Получить это
$array = [
    [
        'foo',
        'a' => 'b'
    ],
    [
        'bar',
        'a' => 'b'
    ],
    'baz'
];


Рекурсия тут вообще не нужна.
<?php
    echo "Что есть:\r\n";
    $array = [
        ['foo'],
        ['bar'],
        'baz'
    ];
    var_dump($arr);
    echo "----------------------------------------------\r\n";
    echo "Что хотим получить:\r\n";
    var_dump([
        [
            'foo',
            'a' => 'b'
        ],
        [
            'bar',
            'a' => 'b'
        ],
        'baz'
    ]);
    echo "----------------------------------------------\r\n";
    echo "Процесс:\r\n";
    
    $add_array = [
        'a' => 'b'
    ];
    
    foreach ($array as $key => $value){
        if(is_array($value)){
            $array[$key] += $add_array;
        }
    }
    
    echo "----------------------------------------------\r\n";
    echo "Полученный результат:\r\n";
    var_dump($array);


Если нужна именно функция, то просто оберни foreach
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
26 апр. 2024, в 09:18
500 руб./в час
26 апр. 2024, в 06:46
1500 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект