Принимает массив полученный из БД где есть поля типа ид_элемента, ид_родителя, полскольку это очень распространеная структура таблиц, я написал класс, (уже давно кстате, фиг знает с чего я ево вдруг выложить решил)
Лично я его использую уже 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, не, не слышал. |
Нет, не слышал... спасибо за названия, погуглю)
А вообще я пишу свой сайт. В котором нет никаких модулей и тп стороних разработчиков(кроме сиглетона), я пишу сам свой велосипед, чтобы учится, вот, например, на этом классе я освоил рекурсию.
Я бы был благодарен за критику, например. Чем хуже этот класс тех которые ты привел выше? функционал не учитывается, я для себя писал
Спустя 2 часа, 30 минут (13.05.2012 - 14:41) redreem написал(а):
я думаю так: построение "ветвистых структур" для вывода на морду - задача не такая уж сложная, чтобы ее обрамлять в отдельный класс и ворочать постоянно кучей массивов. я лично по конретный вывод накидываю функцию, максимально учитывающую нюансы выходных данных - это полюбому + к производительности.
Спустя 34 минуты, 3 секунды (13.05.2012 - 15:15) vagrand написал(а):
exit('аргумент getAttach() не являеттся массивом!');
Зачем уж прямо так и exit() делать. Логичнее было бы кинуть эксепшен, его хоть обработать можно.
_____________
аська 615-817, стучите начинающие прогеры, будем вместе прорываться)