Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2011, 15:51   #1
Ast
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 117
Смущение php рекурсия

само задание:


Комментарии хранятся в следующей таблице:
CREATE TABLE IF NOT EXISTS `comments` (
`c_id` int(11) NOT NULL AUTO_INCREMENT,
`c_parent_id` int(11) DEFAULT NULL,
`c_obj_id` int(11) NOT NULL,
`c_username` varchar(255) NOT NULL,
`c_email` varchar(255) NOT NULL,
`c_publ_date` datetime NOT NULL,
`c_text` text NOT NULL
PRIMARY KEY (`c_id`),
KEY `c_obj_id` (`c_obj_id`),
KEY `c_parent_id` (`c_parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;

Необходимо написать код, который выводит комментарии в виде иерархической структуры для указанного объекта (например, новости). Должна использоваться рекурсия. При этом разрешается выполнить только один sql-запрос. Так же следует учитывать, что в поле «c_obj_id» хранится ID объекта, к которому привязаны комментарии. Разрешается использовать только стандартные средства PHP.


вот что у меня получилось :


<html>
<body>
<?

$db = mysql_connect ("localhost","root","");
mysql_select_db ("test");
$result = mysql_query('SELECT * FROM comments');
while($row = mysql_fetch_array($result))
{
echo "<p>Запись id=".$row['c_id'].". дата: ".$row['c_publ_date'].". Имя: ".$row['c_username'].". email: ".$row['c_email'].". Текст: ".$row['c_text']."</p>";
}
?>
</body>
</html


вопрос:
как сделать рекурсию? и выбор комментариев для конкретного объекта?
заранее спасибо
Ast вне форума Ответить с цитированием
Старый 07.12.2011, 04:32   #2
Ast
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 117
Печаль

знает кто нибудь?
Ast вне форума Ответить с цитированием
Старый 07.12.2011, 08:30   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

кто нибудь знает....
1. не нужно весь массив каментов тащить - достаточно лишь тех, что привязаны к вашему объекту
Код:
$result = mysql_query('SELECT * FROM comments WHERE c_obj_id=',$id);
где в $id - задаете id новости
2. пишем рекурсивную функцию
Код:
function f1($list,$id){
 $new_list=f2($list,id$);
 if ($new_list!=null) {
    foreach ($new_list as $e) {
     echo $e['id'] ;
     $new_id = $e['id'];
     f1($list,$new_id);
   }
}
}
рекурсивно обойдет каменты
а, ну и функция f2 просто возвращает массиив элементы которого c_parent = $id
ADSoft вне форума Ответить с цитированием
Старый 07.12.2011, 08:32   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

код писал навскидку... наверняка есть ошибки) я просто чтоб проиллюстрировать ход мыслей
ADSoft вне форума Ответить с цитированием
Старый 07.12.2011, 09:11   #5
Ast
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 117
Радость

ок спасибо щас попробую отпишусь что вышло
Ast вне форума Ответить с цитированием
Старый 08.12.2011, 16:19   #6
PAAG
Пользователь
 
Регистрация: 08.12.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
код писал навскидку... наверняка есть ошибки) я просто чтоб проиллюстрировать ход мыслей
Лучше получение массива запросом вынести за пределы рекурсивной функции, а при выводе просто проверять, подходящий родитель или нет, тогда не потребуется дополнительный массив заводить и лишний раз бегать.

Для оптимизации можно в запросе отсортировать результате по c_parent_id. Тогда код будет немного сложнее. Это если только очень надо оптимизировать.
PAAG вне форума Ответить с цитированием
Старый 10.12.2011, 16:50   #7
chyvakoff
Пользователь
 
Аватар для chyvakoff
 
Регистрация: 10.12.2011
Сообщений: 91
По умолчанию

Очень часто кстати приходится рисовать иерархию...Вот хороший пример рекурсии на php. я таким примером всегда пользуюсь. Можно кстати перевести и на объекты,не обязательно составлять хэш массив.Но это кому как нравится.
chyvakoff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсия malenkaya Помощь студентам 1 21.02.2011 21:02
Рекурсия cranxx Общие вопросы C/C++ 2 21.02.2011 18:08
рекурсия DinaraIITU Помощь студентам 3 04.11.2010 15:39
Рекурсия Solnze2 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2010 09:28
Рекурсия. Си. MAKEDON Помощь студентам 5 03.06.2009 17:52