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

Форум PHP

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

 

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

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

тема: Дерево - получить все воженные id внутри ветки.
 
 автор: mr.artek   (25.05.2010 в 20:23)   письмо автору
 
 

Есть стандартное дерево

id | parent | name 
1     0      Раздел 1 
2     0      Раздел 2 
3     0      Раздел 3 
4     1      Раздел 1.1
5     1      Раздел 1.2
6     1      Раздел 1.3
7     4      Раздел 1.1.1
8     4      Раздел 1.1.2
9     4      Раздел 1.1.3
10   2      Раздел 2.1


Мне нужно получить все вложенные id внутри какой либо ветки.

например getId(1) вернет 4,5,6,7,8,9
getId(2) вернет 10
getId(4) вернет 7,8,9

  Ответить  
 
 автор: Саня   (25.05.2010 в 20:32)   письмо автору
 
   для: mr.artek   (25.05.2010 в 20:23)
 

<?
$al 
= array(
  
=> array(0'Раздел 1'),
  
=> array(0'Раздел 2'), 
  
=> array(0'Раздел 3'),
  
=> array(1'Раздел 1.1'),
  
=> array(1'Раздел 1.2'),
  
=> array(1'Раздел 1.3'),
  
=> array(4'Раздел 1.1.1'),
  
=> array(4'Раздел 1.1.2'),
  
=> array(4'Раздел 1.1.3'),
  
10 => array(2'Раздел 2.1'),
);

function 
getId($id) {
  global 
$al;
  
$ret = array();
  foreach ( 
$al as $k => $v ) {
    if ( 
$v[0] == $id $ret[] = $k;
  }
  return 
$ret;
}
print_r(getId(1));

  Ответить  
 
 автор: Trianon   (26.05.2010 в 02:51)   письмо автору
 
   для: Саня   (25.05.2010 в 20:32)
 

Удивляете
:(

  Ответить  
 
 автор: Саня   (26.05.2010 в 14:33)   письмо автору
 
   для: Trianon   (26.05.2010 в 02:51)
 

Глобалом?

  Ответить  
 
 автор: mr.artek   (26.05.2010 в 14:37)   письмо автору
 
   для: Саня   (26.05.2010 в 14:33)
 

Допилил ваш код, заработа как надо ) спасибо )

<?
$arr 
= array(
  
=> array(0'Раздел 1'),
  
=> array(0'Раздел 2'),
  
=> array(0'Раздел 3'),
  
=> array(1'Раздел 1.1'),
  
=> array(1'Раздел 1.2'),
  
=> array(1'Раздел 1.3'),
  
=> array(4'Раздел 1.1.1'),
  
=> array(4'Раздел 1.1.2'),
  
=> array(4'Раздел 1.1.3'),
  
10 => array(2'Раздел 2.1'),
);

function 
getId($arr$id) {

  
$return_id = array();
  
$parent_id = array($id);

  foreach(
$arr as $k => $v) {
    if(
in_array($v[0], $parent_id)){
        
$return_id[] = $k;
        
$parent_id[] = $k;
    }
  }
  return 
$return_id;
}
print_r(getId($arr1));
?>

  Ответить  
 
 автор: mr.artek   (26.05.2010 в 14:23)   письмо автору
 
   для: Саня   (25.05.2010 в 20:32)
 

Спасибо, но выводит 4,5,6 то есть опускаеться только на 1 уровень, а нужно получить все подпапки до самого конца, в данном примере 4,5,6,7,8,9

  Ответить  
 
 автор: Саня   (26.05.2010 в 14:38)   письмо автору
 
   для: mr.artek   (26.05.2010 в 14:23)
 

.

  Ответить  
 
 автор: Ури Геллер   (26.05.2010 в 15:47)   письмо автору
 
   для: Саня   (26.05.2010 в 14:38)
 

тут рекурсия нужна, без рекурсии никуда

  Ответить  
 
 автор: Trianon   (27.05.2010 в 01:37)   письмо автору
 
   для: Ури Геллер   (26.05.2010 в 15:47)
 

(устало)
Не нужна тут рекурсия.
Хоть с ней и проще.

  Ответить  
 
 автор: Ури Геллер   (27.05.2010 в 10:57)   письмо автору
 
   для: Trianon   (27.05.2010 в 01:37)
 

без рекурсии это когда выборка идет из базы там соритировать по родителю надо

  Ответить  
 
 автор: Саня   (27.05.2010 в 11:10)   письмо автору
 
   для: Ури Геллер   (27.05.2010 в 10:57)
 

С чего вы взяли что тут идёт работа с базой?

  Ответить  
 
 автор: Tonik992   (27.05.2010 в 11:26)   письмо автору
 
   для: Trianon   (27.05.2010 в 01:37)
 

Trianon, ваш вариант в студию..

  Ответить  
 
 автор: Саня   (27.05.2010 в 11:38)   письмо автору
 
   для: Tonik992   (27.05.2010 в 11:26)
 

Вариант без рекурсии выше на 8 постов.

  Ответить  
 
 автор: Trianon   (27.05.2010 в 12:01)   письмо автору
 
   для: Саня   (27.05.2010 в 11:38)
 

Ваш вариант выдает Array ( [0] => 4 [1] => 5 [2] => 6 ) , и очевидно, это маловато несколько.
собственно, я поэтому и удивился.

  Ответить  
 
 автор: Саня   (27.05.2010 в 12:27)   письмо автору
 
   для: Trianon   (27.05.2010 в 12:01)
 

Да, я упустил подчиненные элементы в своём исходном примере. Но mr.artek дописал мой скрипт в (26.05.2010 в 14:37).

  Ответить  
 
 автор: Trianon   (27.05.2010 в 14:58)   письмо автору
 
   для: Саня   (27.05.2010 в 12:27)
 

В целом - да.

PS to Ури Геллер:
Что лишь подтверждает тезис о том, что для этой задачи рекурсия не нужна, а можно обойтись лишь циклом.

  Ответить  
 
 автор: Саня   (27.05.2010 в 11:38)   письмо автору
 
   для: Tonik992   (27.05.2010 в 11:26)
 

.

  Ответить  
 
 автор: Trianon   (27.05.2010 в 12:03)   письмо автору
 
   для: Tonik992   (27.05.2010 в 11:26)
 

Вам поиском найти пост с соответствующими теоретическими обоснованиями и примером?

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

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