Рекурсивный цикл для многомерных массивов?

#php #loops #recursion #multidimensional-array

#php #циклы #рекурсия #многомерный массив

Вопрос:

В принципе, я хочу использовать str_replace для всех значений многомерного массива. Кажется, я не могу понять, как бы я сделал это для многомерных массивов. Я немного застреваю, когда значением является массив, кажется, что он просто находится в бесконечном цикле. Я новичок в php, поэтому emaples были бы полезны.

 function _replace_amp($post = array(), $new_post = array())
{
    foreach($post as $key => $value)
    {
        if (is_array($value))
        {
           unset($post[$key]);
           $this->_replace_amp($post, $new_post);
        }
        else
        {
            // Replace :amp; for amp; as the amp; would split into different vars.
            $new_post[$key] = str_replace(':amp;', 'amp;', $value);
            unset($post[$key]);
        }
    }

    return $new_post;
}
  

Спасибо

Комментарии:

1. Покажите нам, к чему вы пришли на данный момент.

Ответ №1:

Это неправильно и приведет вас к бесконечному циклу:

 $this->_replace_amp($post, $new_post);
  

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

 function _replace_amp($post = array())
{
    $new_post = array();
    foreach($post as $key => $value)
    {
        if (is_array($value))
        {
           unset($post[$key]);
           $new_post[$key] = $this->_replace_amp($value);
        }
        else
        {
            // Replace :amp; for amp; as the amp; would split into different vars.
            $new_post[$key] = str_replace(':amp;', 'amp;', $value);
            unset($post[$key]);
        }
    }

    return $new_post;
}
  

Ответ №2:

…Что не так с array_walk_recursive?

 <?php
$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function test_print($item, $key)
{
    echo "$key holds $itemn";
}

array_walk_recursive($fruits, 'test_print');
?>
  

Комментарии:

1. Потому что в вашем примере eggs, если вы добавляете вложенный уровень: $fruits = [ 'sweet' => $sweet, 'sour' => 'lemon', 'its_not' => ['recursive_depth'] ]; в этом случае вы не получаете правильный ключ для ‘its_not’ — это дает вам 0 ожидаемый its_not — Или, как кто-то сказал, ЭТА ФУНКЦИЯ ПОСЕЩАЕТ ТОЛЬКО КОНЕЧНЫЕ УЗЛЫ (php.net — лол, он заблокировал его)