Структура таблицы. Прикладываю sql для удобства.
CREATE TABLE `comment` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`status_id` INT(10) UNSIGNED NOT NULL DEFAULT '1',
`profile_id` INT(10) UNSIGNED NOT NULL,
`object_type_id` INT(10) UNSIGNED NOT NULL,
`object_id` INT(10) UNSIGNED NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`comment` TEXT NOT NULL,
`vote` FLOAT UNSIGNED NOT NULL DEFAULT '0',
`count_vote` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`parent_id` INT(10) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`id`),
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
INSERT INTO `comment` (`id`, `status_id`, `profile_id`, `object_type_id`, `object_id`, `created_at`, `comment`, `vote`, `count_vote`, `parent_id`) VALUES (1, 2, 0, 1, 6, '2012-10-19 17:17:51', 'Довольно интересная и поучительная Статья', 0, 0, NULL);
INSERT INTO `comment` (`id`, `status_id`, `profile_id`, `object_type_id`, `object_id`, `created_at`, `comment`, `vote`, `count_vote`, `parent_id`) VALUES (2, 2, 0, 1, 6, '2012-10-19 17:17:55', 'Замечание: Поскольку имена контроллера и действия могут содержать символы-ограничители слов, такие, как \'_\', \'.\', и \'-\', то render() нормализует их к \'-\', когда определяет имя скрипта.', 0, 0, NULL);
INSERT INTO `comment` (`id`, `status_id`, `profile_id`, `object_type_id`, `object_id`, `created_at`, `comment`, `vote`, `count_vote`, `parent_id`) VALUES (3, 2, 0, 1, 6, '2012-10-19 17:18:01', 'нутри себя для такой нормализации он использует ограничители слов и путей для диспетчера. Таким образом, запрос к /foo.bar/baz-bat приведет к рендерингу скрипта foo-bar/baz-bat.phtml.', 0, 0, NULL);
INSERT INTO `comment` (`id`, `status_id`, `profile_id`, `object_type_id`, `object_id`, `created_at`, `comment`, `vote`, `count_vote`, `parent_id`) VALUES (4, 2, 0, 1, 6, '2012-10-19 17:18:11', 'Если ваш метод действия содержит camelCase, то следует иметь в виду, что при определении имени скрипта вида результатом будут разделенные \'-\' слова. ', 0, 0, 3);
INSERT INTO `comment` (`id`, `status_id`, `profile_id`, `object_type_id`, `object_id`, `created_at`, `comment`, `vote`, `count_vote`, `parent_id`) VALUES (5, 2, 0, 1, 6, '2012-10-19 17:18:16', 'Вот уж Аннушка и масло пролила.', 0, 0, 4);
INSERT INTO `comment` (`id`, `status_id`, `profile_id`, `object_type_id`, `object_id`, `created_at`, `comment`, `vote`, `count_vote`, `parent_id`) VALUES (6, 2, 0, 1, 6, '2012-10-19 17:18:37', 'Пушкин написал Есенина.', 0, 0, 3);
INSERT INTO `comment` (`id`, `status_id`, `profile_id`, `object_type_id`, `object_id`, `created_at`, `comment`, `vote`, `count_vote`, `parent_id`) VALUES (7, 2, 0, 1, 6, '2012-10-19 17:18:44', 'Аххаха. Вот это бред.', 0, 0, 6);
INSERT INTO `comment` (`id`, `status_id`, `profile_id`, `object_type_id`, `object_id`, `created_at`, `comment`, `vote`, `count_vote`, `parent_id`) VALUES (8, 2, 0, 1, 6, '2012-10-22 13:08:09', 'Флудерасты блин!', 0, 0, NULL);
INSERT INTO `comment` (`id`, `status_id`, `profile_id`, `object_type_id`, `object_id`, `created_at`, `comment`, `vote`, `count_vote`, `parent_id`) VALUES (9, 2, 0, 1, 6, '2012-10-19 17:18:16', 'Вот уж Аннушка и масло пролила. ч2', 0, 0, 4);
PHP выглядит у меня вот так.
global $a_rows;
$wood = array();
function getChild($parent){
global $a_rows;
$array = array();
$i = 0;
foreach($a_rows as $row){
if($parent['id'] == $row['parent_id']){
$array[$i] = $row;
$array[$i]['child'] = array();
$array[$i]['child'][] = getChild($row);
$i++;
}
}
return $array;
}
$rows = mysql_query($sql);
if(count($rows)){
$rows = mysql_fetch_assoc($rows);
$a_rows = $rows;
}
foreach($a_rows as $row){
if(empty($row['parent_id'])){
$row['child'] = getChild($row['id']);
$wood[$row['id']] = $row;
}
}
echo "<hr><pre>";
print_r($wood);