|
|
|
| Здравствуйте, есть таблица в которой есть ID NAME SUB, где собственно ID - индитификатор, NAME - название раздела, а SUB - чему раздел подчинен. Известны несколько NAME и из них надо найти самый подчиненный. Пробывал через сравнения двух массивов (массив всех что в таблице и массива что формируется известными), но что-то не получилось.
function f_sub($n, $m)
{return array ($n!=$m);}
$ci = array_map("f_sub", $mass_all_sub, $mass_sub);
foreach($ci as $v1)
{
foreach($v1 as $v2)
if($v2)$id_sub=$v2;
}
|
Может кто-то подскажет в каком направлении двигаться? | |
|
|
|
|
|
|
|
для: BMW
(05.01.2011 в 13:46)
| | А самый подчиненный это какой? | |
|
|
|
|
|
|
|
для: sim5
(05.01.2011 в 14:00)
| | самый подчиненый - который из перечисленного количества не упоминается в SUB
Например:
ID | NAME | SUB
1 | Раздел1 | 0
2 | Раздел2 | 0
3 | Подраздел1 |1
4 | Подпод | 3
5 | Подразел2| 2
|
Допустим есть входные данные с ID 1, 3 и 4
И нужно выбрать тот чей ID не упоминается в SUB ни ID 1, ни ID 3, ни ID 4 (то есть в перечне входящих данных). Он то и будет самым подчиненным. Понятно что это ID 4, но что-то никак в формулу не сформулирую, казалось такая обычная задача, но меня заботит уже не первые пару часов | |
|
|
|
|
|
|
|
для: BMW
(05.01.2011 в 14:15)
| | Вообще-то есть родитель, а есть дети. Обычно 0 (отсутствие родителя), это и есть указание на родительскую категорию, для которой удобно имя parent, а уж родитель не может быть подчиненным (по вашей терминологии). По родителю и надо искать.
И вообще, такие вещи это базы данных, и делать это надо ее средствами, а посему прямиком в раздел MySQL и искать такие примеры, а они там описаны не один раз. | |
|
|
|
|
|
|
|
для: BMW
(05.01.2011 в 14:15)
| | Это задача о нахождении кроны дерева. (Крона, вообще-то не один элемент, а множество. )
И решается соответствующим запросом к БД.
UPD.
Между прочим. Если У Вам на уровне приложения эти ключи уже выбраны, и если они представляют из себя путь от корня к элементу кроны, наиболее естественным было бы передавать их упорядоченной последовательностью, а не набором внавал. И тогда элементу кроны соответствовал бы последний элемент массива.
UPD2.
При хранении дерева по методике nested sets (вместо применяемой у Вас adjacency lists) признаком корневого элемента является явное условие n.lb+1==n.rb | |
|
|
|
|
|
|
|
для: Trianon
(05.01.2011 в 14:30)
| | >Это задача о нахождении кроны дерева. (Крона, вообще-то не один элемент, а множество. )
>И решается соответствующим запросом к БД.
>
>
>UPD.
>Между прочим. Если У Вам на уровне приложения эти ключи уже выбраны, и если они представляют из себя путь от корня к элементу кроны, наиболее естественным было бы передавать их упорядоченной последовательностью, а не набором внавал. И тогда элементу кроны соответствовал бы последний элемент массива.
>
Они изначально не упорядочены, просто набор, а чтобы упорядочить, как я понимаю нужно знать иерархию (опять к тому же)
>UPD2.
>При хранении дерева по методике nested sets (вместо применяемой у Вас adjacency lists) признаком корневого элемента является явное условие n.lb+1==n.rb
>
То есть в третьем столбце храним ид того кого подчиняем? | |
|
|
|
|
|
|
|
для: BMW
(05.01.2011 в 15:25)
| | >То есть в третьем столбце храним ид того кого подчиняем?
Нет. Там все значительно сложнее. Но У Вас же все равно схема id - parent_id. | |
|
|
|
|
|
|
|
для: Trianon
(05.01.2011 в 16:04)
| | Расскажите об этой схеме, у меня есть еще возможность изменить) | |
|
|
|
|
|
|
|
для: BMW
(05.01.2011 в 16:52)
| | да что ж такое то...
http://lmgtfy.com/?q=nested%20sets | |
|
|
|
|
|
|
|
для: Trianon
(05.01.2011 в 16:56)
| | Спасибо за стеб) Решил задачу) | |
|
|
|
|
|
|
|
для: BMW
(06.01.2011 в 10:00)
| | Где стеб?
Решили? Респект.
Где код решения? | |
|
|
|
|
|
|
|
для: Trianon
(06.01.2011 в 10:06)
| | Будучи не сильно осведомленым в сложных mysql запросах, решил добить идею с массивами в результате:
$mass_sub[$id]=$sub;// формируем массив из исходных данных
$mass_del=$mass_sub;//дабл массив
foreach($mass_sub as $vv_id => $vv_s)
$mass_del[$vv_s]='';//удаляем те значения чьи ID содержаться в SUB
//print_r($mass_del);
foreach($mass_del as $voo=>$ii)
if($ii!='')echo $voo;// самый подчиненный из перечисленного
|
правда, тут есть правило, нужно обязательно все элементы подчиненности были, без пропусков, но думаю в след модификации устраню, и наверное изменю логику, по-моему более эффективно сторить ветку в иерархии найдя раздел родительский у которго значение 0, а потом начиная с конечного значения проверять те что есть на соответсвие, как только подходят значит это и есть самый подчиненный из перечисленного множества, тут и пропуски в древе будут по барабану. Что Вы думаете об этом? | |
|
|
|
|
|
|
|
для: BMW
(06.01.2011 в 11:01)
| | я не понял, как у Вас из одной строки $mass_sub[$id]=$sub; образовался массив.
UPD. Похоже, въехал.
Если первая строка выполнялась в цикле, так это наверное как-то показать можно было?
Стобственно, что я думаю, я уже ж написал.
Если у Вас есть путь из ключей, упорядоченный по подчиненности, то искомым элементом будет хвост этого пути. Без сложных действий по копированию массива и удалению лишнего.
В то, что получить набор ключей в беспорядке проще, чем упорядоченным, я не верю (при схеме хранения дерева adjacency_lists, которую Вы применяете).
Упорядоченным этот путь получается и при пробеге от последнего потомка к корню, и при пробеге (рекурсивном, очевидно) от корня к потомку. | |
|
|
|
|
|
|
|
для: Trianon
(06.01.2011 в 11:53)
| | добавка:
$all = mysql_query("...");
while($as = mysql_fetch_array($all))
{
$id=$as[id];
$sub=$as[sub];
$mass_sub[$id]=$sub;// формируем массив из исходных данных
}
|
| |
|
|
|