PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (13): « 1 2 3 4 [5] 6 7 8 9 ... » В конец

> Найдено сообщений: 186
Kubert Отправлено: 25 Августа, 2011 - 10:03:55 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка

Ответов: 49
Просмотров: 9866
egir

Вот так достану:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $result=mysql_query("SELECT id,pid,name,idObject FROM category ORDER BY sort,id");
  3. if(mysql_num_rows($result)>0){
  4.         $cats = array();
  5.         $fintParent = array();
  6.         while($cat =  mysql_fetch_assoc($result)){
  7.                 $cats[$cat['pid']][] =  $cat;
  8.                 $listCat[$cat['id']]['id'] =  $cat['id'];
  9.                 $listCat[$cat['id']]['pid'] =  $cat['pid'];
  10.                 $listCat[$cat['id']]['idObject'] =  $cat['idObject'];
  11.                 $listCat[$cat['id']]['name'] =  $cat['name'];
  12.         }
  13. }
  14.  


И выведу:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. function listTree($cats,$parent_id){
  3.         if(is_array($cats) and isset($cats[$parent_id])){
  4.                 $tree = '<ul>';
  5.                         foreach($cats[$parent_id] as $cat){
  6.                                 $tree .= '<li>'.$cat['name'];
  7.                                 $tree .= listTree($cats,$cat['id']);
  8.                                 $tree .= '</li>';
  9.                         }
  10.                 $tree.= '</ul>';
  11.         }
  12.         else return null;
  13.         return $tree;
  14. }
  15.  
  16. //echo listTree($cats,0);
  17.  



DeepVarvar
Функция эта у меня есть(выше написал)! Но спасибо, Вам!
Но затея как раз и состояла в том чтобы в ссылке link прописывать полный путь потомков.
типа:
href="/?idObject1=111&idObject2=222&idObject3=333&idObject4=444"
где 444 активный пункт меню.

+ это поможет мне составить "строку навигации".

А может быть вообще гоню и такие вложенности делают по другому?! Однако


egir
Добавлю WHERE так как у меня в одной таблице категорий лежат все категории для 300 сайтов. а в каждом сайте примерно от 5 до 50 пунктов.
Но я уже подумывал делать сохранять полный путь всех потомков в БД...
Вот теперь и незнаю что делать)

Но если я буду прописывать в БД полный путь потомков, типа "111,222,333,444",
мне все равно придется при добавлении или обновлении страницы, необходимо будет запускать эту злосчастную функцию Ха-ха

А касательно большого кол-во запросов. Уж не хотелось бы этого делать, так как для этого все и замутилось. В данный момент на сайтах стоят как раз такие "обработчики" которые в цикле обращаются постоянно к БД.

Парни помогите, я уже замучился!
Kubert Отправлено: 24 Августа, 2011 - 17:17:50 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка

Ответов: 49
Просмотров: 9866
Champion
Не понимаю...

Мог бы ты привести код для данного примера.

Я же перед тем как вызвать внутренний find() присваиваю значение массиву...
А потом при запуске find() передаю его дальше и так пока функция не дойдет до конца.
Т.е. массив постоянно новый должен передаваться в функцию...
А когда функция закончина, то уже полностью сформированный массив передаю "ретурном".
Разве не так?
Kubert Отправлено: 24 Августа, 2011 - 15:24:15 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка

Ответов: 49
Просмотров: 9866
Мелкий
Что же она вернула и как я игнорирую это... Можете пояснить?

DeepVarvar
Мне из предыдущей функции(ее здесь нет), известен только id который я передаю в этой функции. А эта функция мне как раз помогает найти всех предков этого id...

Я явно запутался Однако
Kubert Отправлено: 24 Августа, 2011 - 14:31:52 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка

Ответов: 49
Просмотров: 9866
Мелкий
Как же?
Я ищу в многомерном массиве $fintParent его родителя и добавляю в массив $listId значение $idObject
вот вроде: $listId[] = $fintParent[$id]['pid'];

Разве нет? А потом снова вызываю эту функцию но с уже id родителя и так до бесконечности пока родитель не будет равен "0"
Kubert Отправлено: 24 Августа, 2011 - 14:16:57 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка

Ответов: 49
Просмотров: 9866
Функция должна искать своих "предков" до корневого(т.е. со значение родителя равного "0"), записывать в массив их idObject...

Примерно картина из БД такая:
CODE (htmlphp):
скопировать код в буфер обмена
  1. id | pid | name | idObject
  2. 1 | 0 | Категория 1 | 111
  3. ...
  4. 3 | 1 | Категория 1.1 | 222
  5. ...
  6. 10 |3 | Категория 1.1.1 | 333
  7. ...
  8. 45 | 10 | Категория 1.1.1.1 | 444
  9. ...



Функция должна выводить примерно такое:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $listId = array(444,333,222,111)



Массив $fintParent такого вида:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $fintParent = array(
  2.     id => 1,
  3.     pid => 0,
  4.     name => Категория 1,
  5.     idObject => 111
  6. );



Сама функция
CODE (htmlphp):
скопировать код в буфер обмена
  1. function find($fintParent,$id,$listId){
  2.         $listId = array();
  3.         if($fintParent[$id]['pid'] != 0){
  4.                 $listId[] = $fintParent[$id]['pid'];
  5.                 find($fintParent,$fintParent[$id]['pid'],$listId);
  6.         }
  7.         return $listId;
  8. }
  9. print_r(find($fintParent,45));
  10.  


Где ошибка?
Сейчас заносит в массив только одного (первого) родителя...
Kubert Отправлено: 23 Августа, 2011 - 18:35:57 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД

Ответов: 24
Просмотров: 114
LIME
Ты меня уж прости)!
Я пытаюсь понять, серьезно!

У тебя последний вариант работает?!
У меня 2 ошибки...

Notice: Undefined индекса: 1 вход / var/www/clients/client2/web7/web /test/26/index.php в строке 23

Фатальная ошибка: Только переменные могут быть переданы по ссылке в / var/www/clients/client2/web7/web /test/26/index.php в строке 24


Короче, буду пробывать, отпишу завтра или вечером... Сейчас уже не могу...
Kubert Отправлено: 23 Августа, 2011 - 18:27:31 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД

Ответов: 24
Просмотров: 114
DeepVarvar
ну да... Этого я хочу достичь... Дерево)
Kubert Отправлено: 23 Августа, 2011 - 18:18:29 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД

Ответов: 24
Просмотров: 114
LIME
Тоже самое. только теперь у элемента pid равно "пустота"

Ну не тоже самое конечно, но не работает
Kubert Отправлено: 23 Августа, 2011 - 18:06:13 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД

Ответов: 24
Просмотров: 114
LIME
Чтото не работает...

CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql_connect("localhost","root","webmaster") or die (mysql_error());
  2. mysql_select_db("mydemo") or die (mysql_error());
  3. mysql_query("set character_set_client   ='cp1251'");
  4. mysql_query("set character_set_results  ='cp1251'");
  5. mysql_query("set collation_connection   ='cp1251_general_ci'");
  6.  
  7. $queryresult = mysql_query('SELECT id,pid,name,idObject FROM category ORDER BY sort,id');
  8. while($row = mysql_fetch_assoc($queryresult)){
  9.         $arrAll[] = array(
  10.                 'id'=>$row['id'],
  11.                 'pid'=>$row['pid'],
  12.                 'name'=>$row['name'],
  13.                 'idObject'=>$row['idObject']
  14.         );
  15. }
  16.  
  17.  
  18. function toTree(&$arrAll){
  19.         foreach($arrAll as &$val){
  20.                 if(isset($val['pid'])){
  21.                         $val['pid']=$arrAll['pid'];
  22.                         toTree($val['pid']);
  23.                 }
  24.         }
  25. }
  26. toTree($arrAll);
  27.  
  28.  
  29. print_r($val);
  30.  
Kubert Отправлено: 23 Августа, 2011 - 17:15:48 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД

Ответов: 24
Просмотров: 114
Господа хотелось бы продолжить тему, так как достиг неких результатов, но не финишировал!
Даю все что имею! Закатив глазки


БД:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. id = обычный ID
  3. pid = его родитель
  4. sort = сортировка
  5. name = имя
  6. idObject = ссылка на какой-то id объекта (это не важно)
  7.  
  8. id | pid | sort | name | idObject
  9. 1 | 0 | 9999 | Категория 1 | ###
  10. 2 | 1 | 9999 | Категория 1.1 | ###
  11. 3 | 1 | 9999 | Категория 1.2 | ###
  12. 4 | 3 | 9999 | Категория 1.2.1 | ###
  13. 5 | 4 | 9999 | Категория 1.2.1.1 | ###
  14. 6 | 4 | 9999 | Категория 1.2.1.2 | ###
  15. 7 | 0 | 9999 | Категория 2 | ###
  16. 8 | 0 | 9999 | Категория 3 | ###
  17.  
  18. и так далее...
  19.  



ЗАДАЧА:
Необходимо преобразовать данные из MySQL в массив такого вида:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $tree=array(
  3.    array('id'=>'1','name'=>'Категория 1','url'=>'###','tree'=>array(
  4.       array('id'=>'2','name'=>'Категория 1.1','url'=>'###'),
  5.       array('id'=>'3','name'=>'Категория 1.2','url'=>'###','tree'=>array(
  6.          array('id'=>'4','name'=>'Категория 1.2.1','url'=>'###','tree'=>array(
  7.             array('id'=>'5','name'=>'Категория 1.2.1.1','url'=>'###'),
  8.             array('id'=>'6','name'=>'Категория 1.2.1.2','url'=>'###')
  9.          )),
  10.       )),
  11.    )),
  12.    array('id'=>'7','name'=>'Категория 2','url'=>'###'),
  13.    array('id'=>'8','name'=>'Категория 3','url'=>'###')
  14. );
  15.  


ДЕЛАЮ ТАК:
mysql_connect("localhost","root","webmaster") or die (mysql_error());
mysql_select_db("mydemo") or die (mysql_error());

$queryresult = mysql_query('SELECT id,pid,name,idObject FROM category ORDER BY sort,id');
while($row = mysql_fetch_assoc($queryresult)){
$arrAll[] = array(
'id'=>$row['id'],
'pid'=>$row['pid'],
'name'=>$row['name'],
'idObject'=>$row['idObject']
);
}

Теперь осталось только "переконвертировать" массив из одного вида в другой с помощью рекурсивной функции.
Но у меня не выходит.
Kubert Отправлено: 23 Августа, 2011 - 11:12:42 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД

Ответов: 24
Просмотров: 114
LIME не понимаю!

у меня вот что...
Спойлер (Отобразить)

(Добавление)
Может мы вообще о разном?))) И я совсем ничего не понимаю...
Kubert Отправлено: 23 Августа, 2011 - 11:01:00 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД

Ответов: 24
Просмотров: 114
LIME
Смотри что у меня получается...

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $link = mysqli_connect("localhost", "root", "webmaster", "mydemo");
  3. $query = "SELECT id,pid,name FROM category";
  4.  
  5. if ($result = mysqli_query($link, $query)) {
  6.         $finfo = mysqli_fetch_fields($result);
  7.         foreach ($finfo as $val){
  8.                 printf("id:  %s\n", $val->id);
  9.                 printf("pid:  %s\n", $val->pid);
  10.                 printf("name:  %s\n", $val->name);
  11.         }
  12.         mysqli_free_result($result);
  13. }              
  14.  


На выходе вижу вот это:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. id:  
  3. pid:  
  4. name:  id
  5. id:  
  6. pid:  
  7. name:  pid
  8. id:  
  9. pid:  
  10. name:  name
  11.  
Kubert Отправлено: 23 Августа, 2011 - 10:48:34 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД

Ответов: 24
Просмотров: 114
LIME пишет:
Kubert а чем не устроила ф-ция приведенная выше?


Я ее не совсем понял...
Можешь на примере объяснить?
Kubert Отправлено: 23 Августа, 2011 - 10:26:47 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД

Ответов: 24
Просмотров: 114
вот так:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $a_tree=array(
  3.   array('k_item' =>1,'s_name' =>'1','a_tree' => array(
  4.     array('k_item' =>2,'s_name' =>'1.1','a_tree' => array(
  5.       array('k_item' =>3,'s_name' =>'1.1.1','a_tree' => array()),
  6.       array('k_item' =>4,'s_name' =>'1.1.2','a_tree' => array()),
  7.       array('k_item' =>5,'s_name' =>'1.1.3','a_tree' => array(
  8.         array('k_item' =>6,'s_name' =>'1.1.3.1','a_tree' => array())
  9.       )),
  10.     )),
  11.     array('k_item' =>7,'s_name' =>'1.2','a_tree' => array()),
  12.     array('k_item' =>8,'s_name' =>'1.3','a_tree' => array(
  13.       array('k_item' =>9,'s_name' =>'1.3.1','a_tree' => array()),
  14.       array('k_item' =>10,'s_name' =>'1.3.2','a_tree' => array())
  15.     )),
  16.     array('k_item' =>11,'s_name' =>'1.4','a_tree' => array(
  17.       array('k_item' =>12,'s_name' =>'1.4.1','a_tree' => array())
  18.     )),
  19.   )),
  20.   array('k_item' =>13,'s_name' =>'2','a_tree' => array()),
  21.   array('k_item' =>14,'s_name' =>'3','a_tree' => array(
  22.     array('k_item' =>15,'s_name' =>'3.1','a_tree' => array())
  23.   ))
  24. );
  25.  

(Добавление)
помойму получилось... вот:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. function mym($i){
  3.         $res = mysql_query("SELECT * FROM category WHERE pid='$i'");
  4.         $topmenu = mysql_fetch_array($res);
  5.         if(isset($topmenu['id'])){
  6.                 do{
  7.                         echo $topmenu['name'].'<br>';
  8.                         mym($topmenu['id']);
  9.                 }while($topmenu = mysql_fetch_array($res));
  10.         }
  11.         return $i;
  12. }
  13.  
  14. mym(0);
  15.  

(Добавление)
опять запутался....
как теперь в массив внести все это безобразие, а потом еще и вынести его из функции...
Kubert Отправлено: 23 Августа, 2011 - 10:12:34 • Тема: вывод список таблиц с бд • Форум: SQL и Архитектура БД

Ответов: 1
Просмотров: 18
PATCH пишет:
тему просьба удалить) нашел ответ SHOW TABLES ) какое логическо название однако)


Ну и ответил бы сам себе, чтобы другие подсмотрели.

Страниц (13): « 1 2 3 4 [5] 6 7 8 9 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB