[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Класс "Вложенности" или "Дерево"
Dagot
Класс возвращает многомерный массив со структурой вложеностей, удобно использовать перед выводом, например
Принимает массив полученный из БД где есть поля типа ид_элемента, ид_родителя, полскольку это очень распространеная структура таблиц, я написал класс, (уже давно кстате, фиг знает с чего я ево вдруг выложить решил)
Лично я его использую уже 4 раза, чтоб сформировать структуру меню, категории товара, для админки два раза...

можно доделать еще, метод установка_полей(), например, просто у меня во всех таблицах эти поля так называются...


class Attachments {

private $_idParent = "idParent"; //название колонки из таблицы с айдишниками родителей
private $_id = "id"; //название колонки из таблицы с айдишниками элементов


public function getAttach($array) {

if(!is_array($array))
exit('аргумент getAttach() не являеттся массивом!');

return $this->_setAttachments($array);
}


private function _setAttachments($array) {

// формируем массив дочеренных элементов
foreach ($array as $key => $v) {

(int)$par = $v[$this->_idParent];

if($par > 0){
//ключ, это id предка; значение, это его потомки(массив)
$child[$par][] = $v;

unset($array[$key]);
}
}

if(isset($child))
$array = $this->_fusionPedigree($array,$child);

return $array;
}


/** _fusionPedigree();
*
* рекурсивная функция, объединяет массивы потомков и родителей
* в один многоуровневый массив
*
*
@param array $array
*
@param array $child
*
@return array
*/

private function _fusionPedigree($array, $child) {

foreach ($array as $key => $par) {

$idPar = $par[$this->_id];

// если у элемента есть потомки...
if(array_key_exists($idPar, $child)){

// ...то "папа" забирает "ребеночка"
$par['child'] = $child[$idPar];
unset($child[$idPar]);

//а вдруг у ребенка тоже есть потомок?
$par['child'] = $this->_fusionPedigree($par['child'], $child);

$array[$key] = $par; // семья возвращается домой
}
}

return $array;
}
}





Спустя 2 часа, 32 минуты, 22 секунды (12.05.2012 - 20:51) vital написал(а):
NesteSets, Adjacency list, не, не слышал.

Спустя 15 часов, 20 минут, 2 секунды (13.05.2012 - 12:11) Dagot написал(а):
Цитата (vital @ 12.05.2012 - 16:51)
NesteSets, Adjacency list, не, не слышал.

Нет, не слышал... спасибо за названия, погуглю)

А вообще я пишу свой сайт. В котором нет никаких модулей и тп стороних разработчиков(кроме сиглетона), я пишу сам свой велосипед, чтобы учится, вот, например, на этом классе я освоил рекурсию. smile.gif

Я бы был благодарен за критику, например. Чем хуже этот класс тех которые ты привел выше? функционал не учитывается, я для себя писал biggrin.gif

Спустя 2 часа, 30 минут (13.05.2012 - 14:41) redreem написал(а):
я думаю так: построение "ветвистых структур" для вывода на морду - задача не такая уж сложная, чтобы ее обрамлять в отдельный класс и ворочать постоянно кучей массивов. я лично по конретный вывод накидываю функцию, максимально учитывающую нюансы выходных данных - это полюбому + к производительности.

Спустя 34 минуты, 3 секунды (13.05.2012 - 15:15) vagrand написал(а):
exit('аргумент getAttach() не являеттся массивом!');


Зачем уж прямо так и exit() делать. Логичнее было бы кинуть эксепшен, его хоть обработать можно.


_____________
аська 615-817, стучите начинающие прогеры, будем вместе прорываться)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.