Взял на изучение CodeIgniter. Все идет нормально, но вот сталкнулся с рекурсией и возникла проблемка.
Суть вот в чем.
Как изветстно в CI есть классная весчь MVC
так вот
пытаюсь из Контролера передать значение на выборку в Модель. В Модели две функции
/***
* Функция для создания цепочки навигации
*
* Возвращает массив с элементами цепочки
*
* $section: из url `name_eng` секции
* $i: первый элемент массива
*
***/
function navigation ($section, $i) {
$query = $this->db->query('SELECT `id`,
`name`,
`name_eng`,
`parent_id`
FROM `catalog`
WHERE `name_eng` = "'.$section.'"');
$row = $query->row();
$navi = self::catalogParents($row->id, 0);
return $navi;
}
В этой функции я вызываю другую функцию catalogParents называется, она должна отработать рекурсивно подняться по каталогу вверх, собрать данные и вернуть массив. Вот сама функция
/***
* Функция поднимающаяся вверх по каталогу
* Возвращает массив с родителями элемента
*
* $element: id или название элемента с которого начинаем подниматься
* $i: первый элемент массива
*
***/
function catalogParents ($element, $i) {
if(is_numeric($element)) {
$query_str = 'WHERE `id` = "'.$element.'"';
}else {
$query_str = 'WHERE `id` = (SELECT `id`
FROM `catalog`
WHERE `name_eng` = "'.$element.'")';
}
$query = $this->db->query('SELECT `id`,
`name`,
`name_eng`,
`parent_id`
FROM `catalog`
'.$query_str.'');
$row = $query->row();
if ($row->parent_id == '0') {
$parent_element[$i]['id'] = $row->id;
$parent_element[$i]['name'] = $row->name;
$parent_element[$i]['name_eng'] = $row->name_eng;
$parent_element[$i]['parent_id'] = $row->parent_id;
//echo 'отдали <br>';
return $parent_element;
}else {
$parent_element[$i]['id'] = $row->id;
$parent_element[$i]['name'] = $row->name;
$parent_element[$i]['name_eng'] = $row->name_eng;
$parent_element[$i]['parent_id'] = $row->parent_id;
//echo 'рекурсия <br>';
$i++;
self::catalogParents($row->parent_id, $i);
}
}
Так вот, проблема в том что рекурсия запоминает только последний элемент, хотя рекурсия происходит верное количество раз.
Пробовал гуглить не помогло, решил спросить мож кто сталкивался.
ПС. Всех с наступившим 2010

Спустя 8 часов, 16 секунд (7.01.2010 - 11:16) Oyeme написал(а):
Измени на то что я тебе написал:
У тебя получается так :
Ты заполняешь массив
Но не передаёшь его.
Идёт рекурсия.
И он заново заполняеться,до последнего раза рекурсии и токо тогда он возращяет один массив.
Либо объявить его статическим массивом либо как я написал передавать его.
Со статическим методом я его туго себе предст являю по причинам много разового использования.
function catalogParents ($element, $i = 0,$parent_element = false) {
// добавь новый аргумент токо в false по default, и i = 0
......
......
if ($row->parent_id == '0') {
$parent_element[$i]['id'] = $row->id;
$parent_element[$i]['name'] = $row->name;
$parent_element[$i]['name_eng'] = $row->name_eng;
$parent_element[$i]['parent_id'] = $row->parent_id;
//echo 'отдали <br>';
return $parent_element;
}else {
$parent_element[$i]['id'] = $row->id;
$parent_element[$i]['name'] = $row->name;
$parent_element[$i]['name_eng'] = $row->name_eng;
$parent_element[$i]['parent_id'] = $row->parent_id;
//echo 'рекурсия <br>';
$i++;
self::catalogParents($row->parent_id, $i,$parent_element); // добавь новый аргумент,тут мы передаём весь массив
}
}
У тебя получается так :
Ты заполняешь массив
Но не передаёшь его.
Идёт рекурсия.
И он заново заполняеться,до последнего раза рекурсии и токо тогда он возращяет один массив.
Либо объявить его статическим массивом либо как я написал передавать его.
Со статическим методом я его туго себе предст являю по причинам много разового использования.
Спустя 7 часов, 57 минут, 3 секунды (7.01.2010 - 19:14) REZzANATOR написал(а):
Спасибо, теперь в догадках почему полученный массив $parent_element не хочет отдаваться return ом
делаем распечатку
то массив показывается...
бред какой то
$nav = self::catalogParents($row->id);функция срабатывает, массив заполнятся, но не возвращяется. При этом если делать проверку вместо
return $parent_element;
делаем распечатку
print_r($parent_element);
то массив показывается...

Спустя 2 года, 7 месяцев, 7 дней, 20 часов, 8 минут, 58 секунд (15.08.2012 - 14:22) Гость_Игорь написал(а):
Спасибо! Вы мне очень помогли:)
_____________