Задать вопрос
@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;
});


Но массив не изменяется. Как её правильно использовать?
  • Вопрос задан
  • 134 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 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
Ответ написан
Ваш ответ на вопрос

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

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