[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перепиливание рекурсивной функции
Игорь_Vasinsky
соб-но, есть массив такого вида - индексы корневых элементов этого массива - parent_id (0 - корневая категория)
здесь видно что в первом элементе у меня всего 2 категории (корневые), в элементе с индексом 1 - 1 категория от родительской "Билеты на концерт"

Свернутый текст
Array
(
[0] => Array
(
[0] => Array
(
[catid] => 1
[parent] => 0
[name] => Билеты на концерт
[prdescription] =>
[pseudonim] => bilety_na_kontsert
)

[1] => Array
(
[catid] => 3
[parent] => 0
[name] => Билеты в театр
[prdescription] =>
[pseudonim] => bilety_v_teatr
)

)

[1] => Array
(
[0] => Array
(
[catid] => 4
[parent] => 1
[name] => Концерт димы билана
[prdescription] =>
[pseudonim] => kontsert_dimy_bilana
)

)

)


сама функция древа вот: (вызывается с 0 в качестве 2го аргумента)


Свернутый текст
function  build_tree($category,$parent_id){

if(is_array($category) AND ( isset($category[$parent_id]) AND count($category[$parent_id])> 0)){

$tree = '<ul>';

foreach($category[$parent_id] as $cat){

$tree .= '<li>'.$cat['name'];

$tree .= build_tree($category,$cat['catid']);

$tree .= '</li>';

}

$tree .= '</ul>';

}
else return null;

return $tree;
}


Мне необходимо списки заменить на option для select, в качестве value - $cat['catid'] - т.е. ID категории (не родителя)

соб-но что первы круг функция нормально расставляет CATID, но во время рекурсии заменяет его PARENT_ID.


Может есть у кого готовое решение для SELECT???



Спустя 36 минут, 21 секунда (2.08.2012 - 12:24) kamanch написал(а):
Я ее узнал в лицо. Это xt:Commerse? smile.gif

Спустя 8 минут, 28 секунд (2.08.2012 - 12:33) Игорь_Vasinsky написал(а):
наверно, валялась на просторах рунета, вот и подобрал.

Спустя 5 минут, 52 секунды (2.08.2012 - 12:38) kamanch написал(а):
Не совсем понятна твоя цель.
Списками там реализуется множественная вложенность.
А что должно быть в твоих select'ах?
Или для каждого родителя свой select и уровень вложенности = 1 ?

Или каждый следующий select - это потомки от выбранного options предыдущего select'a (a-ля Ajax) ?

Спустя 3 минуты, 22 секунды (2.08.2012 - 12:42) Игорь_Vasinsky написал(а):
неееет.. всё намного проще. сформировать select c option - но тоже с иерархией.

типо этого

parent
-child
--child
parent
-child
-child
parent
-child
--child
---child


Спустя 13 минут, 39 секунд (2.08.2012 - 12:55) kamanch написал(а):
Возможно я туплю, т.к. еще не ложился спать, но у селекта же не бывает вложенности. blink.gif
Нарисуй html вложенного селекта.

Спустя 4 минуты, 41 секунда (2.08.2012 - 13:00) inpost написал(а):
kamanch
есть родитель OPTGROUP, и есть дочерний, итого 2 уровня, но не более smile.gif

Игорь_Vasinsky
Реально непонятно smile.gif Пример бы показал в сети.

Спустя 26 секунд (2.08.2012 - 13:01) Игорь_Vasinsky написал(а):
Да визуальная вложенность))))))))))

<select>
<option>
Parent1</option>
<option>
-Child1-1</option>
<option>
-Child2-1</option>
<option>
--Child1-2</option>
<option>
Parent2</option>
</select>



))))) чтобы в select визуально было представление категорий и подкатегорий

Спустя 2 минуты, 50 секунд (2.08.2012 - 13:03) inpost написал(а):
Игорь_Vasinsky
Я не могу понять каким образом будут подставлять parent, child1, когда в массиве мы имеем только лишь последний уровень - самый нижний child.

Спустя 5 минут, 13 секунд (2.08.2012 - 13:09) Игорь_Vasinsky написал(а):
в массиве все уровни с корневого

см 1 пост - есть многомерный массив, который содержит 2 элемента с индексами 0 и 1.

в элементе 0 - все корневые каталоги, т.к. у них и parent_id = 0

далее элемент с ключом 1 - это child от родителя с pid=1

вот так этот массив наполняется - в качестве ключей - pid родителя

Спустя 1 час, 46 минут, 53 секунды (2.08.2012 - 14:55) Gradus написал(а):
только не кричите что это говнокод и говнометод и так понятно :)

//recalbs(массив списка, id для дефолт выбора из списка т.е. selected)
echo "<select>";
echo recalbs($mas,1);
echo "</select>";

function recalbs(&$mass,&$st=0,$level=1,$index=null){
$lmass=isset($index)?$mass[$index]:$mass;
if(empty($lmass)) return;
$r='';
foreach($lmass as $k=>$val){
if(isset($val['id'])) {
$r.='<option value="'.$val['id'].'" '.($st==$val['id']?'selected':'').'>'.str_repeat('-',$level).' '.$val['name'].'</option>';
unset($mass[$index][$k]);
if(isset($mass[$val['id']])) { $r.=recalbs($mass,$st,1+$level,$val['id']); }
}
else $r.=recalbs($mass,$st,1,$k);
}
return $r;
}

Спустя 9 минут, 18 секунд (2.08.2012 - 15:05) Игорь_Vasinsky написал(а):
нет уровня вложенности. т.е. нет сведений в БД об вложенности.

я расчитывать подсчитывать рекурсии или что нить.

и не понятно какого вида должен быть массив и 2й аргумент функции - что за "id для selected"?

и вообще по аргументом трудно понять что за что .

Спустя 10 минут, 5 секунд (2.08.2012 - 15:15) Gradus написал(а):
Игорь_Vasinsky, может так будет наглядей
$glidgr=isset($_GET['glidgr'])?(int)$_GET['glidgr']:0;
$mas=array();
$r=mysql_query("SELECT `parent`,`id`,`name` FROM `list`");
while($g=mysql_fetch_assoc($r)){
if(!isset($mas[$g['parent']])) $mas[$g['parent']]=array();
$mas[$g['parent']][]=$g;
}
echo '<select>'.recalbs($mas,$glidgr).'</select>';


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

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