рекурсия + массивы

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
yintar
Сообщения: 106
Зарегистрирован: 2014.02.09, 11:27

рекурсия + массивы

Сообщение yintar »

Всем привет!!!. помогите,пожалуйста, разобраться что не так.
Есть такой массив (он может быть неограниченной вложенности):

Код: Выделить всё

$b = array(
    '0' => array(
        'text' => 'фрукты',
        'count' => '2',
        'line' => '1',
        'children' => array(
            '0' => array(
                'text' => 'банан',
                'count' => '10',
                'line' => '2',
                'children' => '',
            ),
            '1' => array(
                'text' => 'груша',
                'count' => '5',
                'line' => '3',
                'children' => array(
                    '0' => array(
                        'text' => 'дыня',
                        'count' => '1',
                        'line' => '5',
                        'children' => array(
                            '0' => array(
                                'text' => 'арбуз',
                                'count' => '1',
                                'line' => '5',
                                'children' => '',
                            )
                        )
                    )
                )
            )
        )
    )
);
 

Код: Выделить всё

А мне нужен такой:[code=php]
Array
(
    [0] => Array
        (
            [text] => банан
            [count] => 10
            [line] => 2
            [children] =>
        )

    [1] => Array
        (
            [text] => дыня
            [count] => 1
            [line] => 5
            [children] =>
        )

    [2] => Array
        (
            [text] => груша
            [count] => 5
            [line] => 3
            [children] =>
        )
   
     [3] => Array
        (
            [text] => арбуз
            [count] => 5
            [line] => 3
            [children] =>
        )
    [4] => Array
        (
            [text] => фрукты
            [count] => 2
            [line] => 1
            [children] =>
        )

)
 [/code]

Код: Выделить всё

В принципе не важно в какой последовательности расположены элементы(фрукты,арбуз,груша,дыня,банан) в массиве,а главное чтобы они все там были.
Делаю. так:[code=php]
function test($b) {
    $a = array();
    foreach ($b as $item) {
        if ($item['children'] != '') {
            $a += test($item['children']);
        }

        $item['children'] = '';
        $a[] = $item;
    }

    return $a;
}
 [/code]
но в массиве не хватает элемента
(
[text] => арбуз
[count] => 5
[line] => 3
[children] =>
)
Что я делаю не так???????????
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: рекурсия + массивы

Сообщение solo »

перестать бездумно копипастить пропуская static и немного почитать ман.
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: рекурсия + массивы

Сообщение solo »

Код: Выделить всё

function withdraw($array){
    static $list = [];
    foreach($array as $item){
        $list[] = array_slice($item, 0,3);
        if(is_array($item['children']))
            withdraw($item['children']);
    }
    return $list;
}

$result = withdraw($b);
var_dump($result); 
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: рекурсия + массивы

Сообщение solo »

пример без static

Код: Выделить всё

function func($array){
    $list = [];
    foreach($array as $item) {
        $list[] = array_slice($item, 0, -1);
        if(is_array($item['children'])) {
            $list = array_merge(
                $list,
                func($item['children'])
            );
        }
    }
    return $list;
}

$result = func($b);
var_dump($result);
Beluj
Сообщения: 37
Зарегистрирован: 2014.06.18, 19:52

Re: рекурсия + массивы

Сообщение Beluj »

А можно вроде и передавать просто ссылку на масив в который помещать результат

function func($array, &$resultArray);
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: рекурсия + массивы

Сообщение solo »

Beluj писал(а):А можно вроде и передавать просто ссылку на масив в который помещать результат
function func($array, &$resultArray);
Да, вроде и можно и на одной ноге поскакать.
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: рекурсия + массивы

Сообщение solo »

Код: Выделить всё

function recursive($array, &$newArray){
    foreach($array as $item) {
        if(is_array($item['children'])) {
            recursive($item['children'], $newArray);
        }
        unset($item['children']);
        $newArray[] = $item;
    }
} 
Ответить