Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Самый подчиненный элемент
 
 автор: BMW   (05.01.2011 в 13:46)   письмо автору
 
 

Здравствуйте, есть таблица в которой есть 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;
    }

Может кто-то подскажет в каком направлении двигаться?

  Ответить  
 
 автор: sim5   (05.01.2011 в 14:00)   письмо автору
 
   для: BMW   (05.01.2011 в 13:46)
 

А самый подчиненный это какой?

  Ответить  
 
 автор: BMW   (05.01.2011 в 14:15)   письмо автору
 
   для: 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, но что-то никак в формулу не сформулирую, казалось такая обычная задача, но меня заботит уже не первые пару часов

  Ответить  
 
 автор: sim5   (05.01.2011 в 14:25)   письмо автору
 
   для: BMW   (05.01.2011 в 14:15)
 

Вообще-то есть родитель, а есть дети. Обычно 0 (отсутствие родителя), это и есть указание на родительскую категорию, для которой удобно имя parent, а уж родитель не может быть подчиненным (по вашей терминологии). По родителю и надо искать.
И вообще, такие вещи это базы данных, и делать это надо ее средствами, а посему прямиком в раздел MySQL и искать такие примеры, а они там описаны не один раз.

  Ответить  
 
 автор: Trianon   (05.01.2011 в 14:30)   письмо автору
 
   для: BMW   (05.01.2011 в 14:15)
 

Это задача о нахождении кроны дерева. (Крона, вообще-то не один элемент, а множество. )
И решается соответствующим запросом к БД.


UPD.
Между прочим. Если У Вам на уровне приложения эти ключи уже выбраны, и если они представляют из себя путь от корня к элементу кроны, наиболее естественным было бы передавать их упорядоченной последовательностью, а не набором внавал. И тогда элементу кроны соответствовал бы последний элемент массива.

UPD2.
При хранении дерева по методике nested sets (вместо применяемой у Вас adjacency lists) признаком корневого элемента является явное условие n.lb+1==n.rb

  Ответить  
 
 автор: BMW   (05.01.2011 в 15:25)   письмо автору
 
   для: Trianon   (05.01.2011 в 14:30)
 

>Это задача о нахождении кроны дерева. (Крона, вообще-то не один элемент, а множество. )
>И решается соответствующим запросом к БД.
>
>
>UPD.
>Между прочим. Если У Вам на уровне приложения эти ключи уже выбраны, и если они представляют из себя путь от корня к элементу кроны, наиболее естественным было бы передавать их упорядоченной последовательностью, а не набором внавал. И тогда элементу кроны соответствовал бы последний элемент массива.
>
Они изначально не упорядочены, просто набор, а чтобы упорядочить, как я понимаю нужно знать иерархию (опять к тому же)
>UPD2.
>При хранении дерева по методике nested sets (вместо применяемой у Вас adjacency lists) признаком корневого элемента является явное условие n.lb+1==n.rb
>
То есть в третьем столбце храним ид того кого подчиняем?

  Ответить  
 
 автор: Trianon   (05.01.2011 в 16:04)   письмо автору
 
   для: BMW   (05.01.2011 в 15:25)
 

>То есть в третьем столбце храним ид того кого подчиняем?
Нет. Там все значительно сложнее. Но У Вас же все равно схема id - parent_id.

  Ответить  
 
 автор: BMW   (05.01.2011 в 16:52)   письмо автору
 
   для: Trianon   (05.01.2011 в 16:04)
 

Расскажите об этой схеме, у меня есть еще возможность изменить)

  Ответить  
 
 автор: Trianon   (05.01.2011 в 16:56)   письмо автору
 
   для: BMW   (05.01.2011 в 16:52)
 

да что ж такое то...
http://lmgtfy.com/?q=nested%20sets

  Ответить  
 
 автор: BMW   (06.01.2011 в 10:00)   письмо автору
 
   для: Trianon   (05.01.2011 в 16:56)
 

Спасибо за стеб) Решил задачу)

  Ответить  
 
 автор: Trianon   (06.01.2011 в 10:06)   письмо автору
 
   для: BMW   (06.01.2011 в 10:00)
 

Где стеб?

Решили? Респект.
Где код решения?

  Ответить  
 
 автор: BMW   (06.01.2011 в 11:01)   письмо автору
 
   для: 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, а потом начиная с конечного значения проверять те что есть на соответсвие, как только подходят значит это и есть самый подчиненный из перечисленного множества, тут и пропуски в древе будут по барабану. Что Вы думаете об этом?

  Ответить  
 
 автор: Trianon   (06.01.2011 в 11:53)   письмо автору
 
   для: BMW   (06.01.2011 в 11:01)
 

я не понял, как у Вас из одной строки $mass_sub[$id]=$sub; образовался массив.

UPD. Похоже, въехал.
Если первая строка выполнялась в цикле, так это наверное как-то показать можно было?


Стобственно, что я думаю, я уже ж написал.
Если у Вас есть путь из ключей, упорядоченный по подчиненности, то искомым элементом будет хвост этого пути. Без сложных действий по копированию массива и удалению лишнего.
В то, что получить набор ключей в беспорядке проще, чем упорядоченным, я не верю (при схеме хранения дерева adjacency_lists, которую Вы применяете).
Упорядоченным этот путь получается и при пробеге от последнего потомка к корню, и при пробеге (рекурсивном, очевидно) от корня к потомку.

  Ответить  
 
 автор: BMW   (06.01.2011 в 12:03)   письмо автору
 
   для: 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;// формируем массив из исходных данных
}

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования