$sql = ("SELECT id, post, parent_id, name, comment,
DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add
FROM comments WHERE post='$id_mess'");
$query = mysql_query($sql);
while($row = mysql_fetch_assoc($query))
{
$data[$row[id]] = $row;
}
/*Функция для создания дерева комментариев */
function mapTree($dataset) {
$tree = array(); // Создаем новый массив
/*
Проходим в цикле по массиву $dataset, который был передан в качестве аргумента.
в $id будет попадать уникальный id комментария,
&$node - обратите внимание, работаем со значением по ссылке!
*/
foreach ($dataset as $id=>&$node) {
if (!$node['parent_id']) { // не имеет родителя, т.е. корневой элемент#000000
$tree[$id] = &$node;
} else {
/*
Иначе это чей-то потомок
этого потомка переносим в родительский элемент,
при этом у родителя внутри элемента создастся массив childs, в котором и будут вложены его потомки
*/
$dataset[$node['parent_id']]['childs'][$id] = &$node; //
}
}
return $tree;
}
она работает прекрасно если в базе есть хотя бы один комментарий. Если комментариев еще нет то возвращается ошибка: Warning: Invalid argument supplied for foreach(). Подскажите пожалуйста как избавиться от этой ошибки.
Спустя 11 минут, 1 секунда (1.04.2012 - 08:57) Invis1ble написал(а):
Цитата |
Warning: Invalid argument supplied for foreach() |
текст ошибки явно говорит о том, что в foreach попадает неверный тип данных, т.е. не массив
Спустя 1 минута, 44 секунды (1.04.2012 - 08:59) Alex75 написал(а):
Да, я это уже понял, я не знаю как от этого избавиться.
Спустя 1 минута, 25 секунд (1.04.2012 - 09:00) Invis1ble написал(а):
перед вызовом mapTree проверять передаваемый аргумент
Спустя 5 минут, 41 секунда (1.04.2012 - 09:06) Alex75 написал(а):
Я не знаю как это сделать. Если знаете, подскажите пожалуйста.
Спустя 2 минуты, 16 секунд (1.04.2012 - 09:08) Invis1ble написал(а):
покажи, как вызывается mapTree()
Спустя 3 минуты, 25 секунд (1.04.2012 - 09:12) Alex75 написал(а):
Это? $data = mapTree($data);
Спустя 2 минуты, 22 секунды (1.04.2012 - 09:14) Invis1ble написал(а):
$data = is_array($data) ? mapTree($data) : array();
Спустя 4 минуты, 46 секунд (1.04.2012 - 09:19) Alex75 написал(а):
Вау, пропала ошибка. Большой респект. Не могли написать как читается сей волшебный код?
Спустя 3 минуты, 26 секунд (1.04.2012 - 09:22) Invis1ble написал(а):
В каком смысле "читается"? Это сокращенная запись для if-else, если data является массивом, то вызывается ф-ция mapTree и результат присваивается data, иначе присваивается пустой массив
Спустя 6 минут, 1 секунда (1.04.2012 - 09:28) Alex75 написал(а):
Да, меня сокращенная запись сбила с толку, я пока такой не понимаю. Спасибо большое.
Спустя 10 минут, 43 секунды (1.04.2012 - 09:39) johniek_comp написал(а):
Alex75
тут понятно написано что это такое
тут понятно написано что это такое
Спустя 1 час, 52 минуты, 42 секунды (1.04.2012 - 11:32) Alex75 написал(а):
johniek_comp Респект тоже.
Спустя 9 минут, 40 секунд (1.04.2012 - 11:41) killer8080 написал(а):
Alex75
Можно делать проверку и внутри функции
Можно делать проверку и внутри функции
function mapTree($dataset) {
$tree = array(); // Создаем новый массив
if(!is_array($dataset))
return $tree;
/*
Проходим в цикле по массиву $dataset, который был передан в качестве аргумента.
в $id будет попадать уникальный id комментария,
&$node - обратите внимание, работаем со значением по ссылке!
*/
foreach ($dataset as $id=>&$node) {
...
Спустя 5 минут, 53 секунды (1.04.2012 - 11:47) Alex75 написал(а):
Цитата (killer8080 @ 1.04.2012 - 08:41) |
Alex75 Можно делать проверку и внутри функции function mapTree($dataset) { |
Проверил
if(!is_array($dataset))
return $tree;
Тоже работает. Респект.
На этом форуме реально мне помогли. На других предлагают сначала школу закончить потом книги по php выучить наизусть и тд. Не понятно зачем форумы вообще создавали, написали бы сразу на главной странице "читайте книги и сюда не ходите".
Спасибо вам всем кто помог.