[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: CodeIgniter и рекурсия
REZzANATOR
Всем привет. Не знал в какую ветку запостить, остановился здесь.

Взял на изучение 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 smile.gif




Спустя 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);

то массив показывается...

blink.gif бред какой то

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


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.