Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > разбить массив


Автор: Gold Dragon 25.5.2009, 15:53
есть массив типа
Код

Array
(
    [0] => Array
        (
            [id] => 1
            [parent ] => 0
            [name] => Автомобили
        )

    [1] => Array
        (
            [id] => 2
            [parent ] => 0
            [name] => Безопасность
        )

    [2] => Array
        (
            [id] => 3
            [parent ] => 0
            [name] => Бизнес и финансы
        )
***
    [32] => Array
        (
            [id] => 33
            [parent ] => 1
            [name] => Автозапчасти – производство продажа
        )

    [33] => Array
        (
            [id] => 34
            [parent ] => 1
            [name] => Автокосметика
        )

    [34] => Array
        (
            [id] => 35
            [parent ] => 1
            [name] => Автомобили грузовые
        )
***
    [61] => Array
        (
            [id] => 62
            [parent ] => 2
            [name] => Безопасность информационная
        )

    [62] => Array
        (
            [id] => 63
            [parent ] => 2
            [name] => Безопасность личная
        )

    [63] => Array
        (
            [id] => 64
            [parent ] => 2
            [name] => Безопасность радиационная
        )

    [64] => Array
        (
            [id] => 65
            [parent ] => 2
            [name] => Безопасность экономическая
        )
***
    [75] => Array
        (
            [id] => 76
            [parent ] => 3
            [name] => Аудиторские услуги
        )

    [76] => Array
        (
            [id] => 77
            [parent ] => 3
            [name] => Аукционы
        )

    [77] => Array
        (
            [id] => 78
            [parent ] => 3
            [name] => Банки зарубежные
        )
***
)

необходимо разбить массивы (или сделать выборку) по [parent ].

Автор: primesite 25.5.2009, 16:37
так ?

Код

$by_parents = array();

foreach ($array as $item) {
    $by_parents[$item['parent']][] = $item;
}

Автор: Gold Dragon 26.5.2009, 08:36
это явно что-то не то... получается какае-то бесконечнае арифметическая прогрессия массивов

Автор: NLspieler 26.5.2009, 09:02
Если я правильно понял, то нужно получить элементы массива, в которых parent_id соответствует определенному номеру?

Тогда эта функция должна помочь:

Код

<?php

function by_parent ($your_array , $parent_id)
{
    foreach ($your_array as $value)
    {
        if ($value['parent']==$parent_id) 
        {
            $return[] = $value ;
        }
    }
    
    return $return ;
}

$new_array = by_parent ($your_array , 2) ;
?>


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

Автор: Gold Dragon 26.5.2009, 09:18
наверное я не с того начал...  У меня в базе есть список ЧЕГО-ТО, у которого есть ID и есть родитель(parent), т.е. вложенная структура. Всё это в массив и помещается подряд. Может мне сразу из базы эти данные вынимать в "нормальном" виде? может так проще?

по функции... наверное не то. Во-первых, нужно вынимать все записи, а значит нужно ещё где-то цикл делать. Во-вторых, каждый раз нужно перебирать заново весь массив.. это как-то не продуктивно smile

Автор: NLspieler 26.5.2009, 10:25
Ну тогда наверное подайдет такой массив:

$array[parent][номер записи] = array ([id] => 1 [name] => Автомобили) ;

перебирать нужно только один раз, впоследствии обращатся можно просто по номеру парент.


Код

<?php

function by_parent ($your_array)
{
    foreach ($your_array as $value)
    {
            $parent_id = $value['parent'] ;
            $return[$parent_id][] = $value ;
    }
    
    return $return ;
}

$new_array_by_parent = by_parent ($your_array) ;

$array = $new_array_by_parent[10] ; // выбрать записи с parentom 10
?>




Автор: gta4kv 26.5.2009, 10:55
Вот тоже как то с выводом дерева разбирался: http://forum.vingrad.ru/forum/topic-209674/hl/%25D0%25B4%25D0%25B5%25D1%2580%25D0%25B5%25D0%25B2%25D0%25BE/index.html (последний пост, рабочее решение)

Автор: Gold Dragon 26.5.2009, 13:48
NLspieler, именно то что доктор прописал!!! Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)