Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> return и рекурсия 
:(
    Опции темы
Raily
Дата 1.11.2011, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



У меня такой вопрос - написала рекурсию, приводить код тут не буду - длинный он, с множеством циклов внутри рекурсии (в основном циклы for).  В определённые моменты я пытаюсь выйти из рекурсии и возвратить себе значение, пишу следующее:

Код

else{
print "ВЫХОД";
return $obj_el;
}

Пропечатка стоит для того, чтобы понять, что в данный else осуществлён вход. Так вот пропечатка выводится на экран, но при этом выход из рекурсии не осуществляется - продолжается проход по её внутренним циклам. У меня такой вопрос - я думала, что return тут же прерывает скрипт, типа exit, только ещё и возвращается нужное значение, это не так?  $obj_el всегда имеет какое-то значение. Вопрос - почему не осуществляется выход из рекурсии, как работает return? 
PM MAIL   Вверх
CruorVult
Дата 1.11.2011, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: 9
Всего: 28



Цитата(Raily @  1.11.2011,  11:54 Найти цитируемый пост)
как работает return


return должен выйти из текущей рекурсивной процедуры, но если запущены еще другие - то соответсвенно продолжится выполнения. Т.к. весь код не приведен - то сказать точно, что не так не могу.
PM MAIL Skype   Вверх
Evghenusi
Дата 1.11.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: 6
Всего: 15



у меня подозрение что автору нужен break

Добавлено через 2 минуты и 35 секунд
p.s. понравилось выражение "Пропечатка", намотаю на ус  smile 
PM WWW   Вверх
CruorVult
Дата 1.11.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 868
Регистрация: 24.9.2008
Где: г.Киев, Украина

Репутация: 9
Всего: 28



Цитата(Evghenusi @  1.11.2011,  12:06 Найти цитируемый пост)
у меня подозрение что автору нужен break

эмм..если был бы 
Код

return;


то возможно, а так 

Код

return $obj_el;

PM MAIL Skype   Вверх
Raily
Дата 1.11.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



Приведу код, но сильно не пугайтесь - да, он ужасен, но с рекурсиями и деревьями у меня вечные проблемы.

Смысл задачи вот в чём - мне приходит XML, содержащий в тегах элементы HTML в определённом виде, мне нужно из XML сделать объект вида: obj[0]->id=1, obj[0]->id=name1, obj[1]->id=2, obj[1]->name=name2 и т.д. 
Первая функция берёт XML - пока из файла, а затем идёт в функция xml_to_object, которая преобразует объект XML в нужного мне вида объект. 

В конце функции xml_to_object у меня наставлено много return, вот пропетачки  там выводятся, а выход из функции не осуществляется - продолжается пробежка по циклу for($i=$count_level[$n];$i<$count_lev[$n];$i++){}

Не знаю, можно ли по этому коду что-то подсказать, но вдруг)) 

Код

//Берём XML
public function for_json(){
        global $n,$glob_i;

        $content =  implode ( "", file ( 'otvet3_2.xml' ) );
        $content2 = iconv("UTF-8", "windows-1251". "//IGNORE", $content);
        $xml=simplexml_load_string($content);
        
        $n=0;
        $glob_i=0;
        $element_new="";
        $count_level[0]=0;
        $count_lev[0]=count($xml->PARAMS->KEY);
        
        $element=$xml->PARAMS->KEY[0];
        $mas_element[$n]=$element;
        $pref="PRM";
        $obj=$this->xml_to_object($xml,$mas_element,$element,$count_level,$count_lev,$pref);
    }

//функция создания объекта для последующего преобразования его в json
    //$count_level - количество уже добавленных элементов данного уровня
    //count_ch - общее количество элементов данного уровня
    public function xml_to_object($xml,$mas_element,$element_new,$count_level,$count_lev,$pref){
        //n - глубина 
        global $obj_el,$n,$glob_i;
        
        $count_parts=count($xml->PARAMS->KEY);

        if(!isset($count_level[$n])){$count_level[$n]=0;}
        if(!isset($count_lev[$n])){$count_lev[$n]=0;}
        
        for($i=$count_level[$n];$i<$count_lev[$n];$i++){
            if(isset($element_new["ptype"])){
                if($element_new["ptype"]=="PRM"){$pref="PRM";}
                if($element_new["ptype"]=="FRM"){$pref="FRM";}
            }

            //переменные для обращения к элементам пришедшего XML
            $element=$xml->PARAMS->KEY[$i];
            $el_id=$pref."_ID";
            $el_name=$pref."_NAME";
            $el_value=$pref."_VALUE";
            $el_label=$pref."_LABEL";
            $el_icon=$pref."_ICON";
            $el_type=$pref."_TYPE";
            $el_link=$pref."_LINK";
            $el_chlds=$pref."_CHLDS";
            
            //новый объект
            $obj_el[$glob_i]->id=(string)$element_new->$el_id;
            $obj_el[$glob_i]->name=(string)$element_new->$el_name;
            $obj_el[$glob_i]->label=(string)$element_new->$el_label;
            $obj_el[$glob_i]->value=(string)$element_new->$el_value;
            $obj_el[$glob_i]->icon=(string)$element_new->$el_icon;
            $obj_el[$glob_i]->type=(string)$element_new->$el_type;    
            if(isset($mas_element[$n-1]->$el_id)){$obj_el[$glob_i]->parent=(string)$mas_element[$n-1]->$el_id;}
            else{$obj_el[$glob_i]->parent=0;}
            $obj_el[$glob_i]->count_chld=0;    
            
            //если есть дочерние элементы, то нужно добавить в объект их
            if(isset($element_new->$el_chlds)){
                print "<p>Есть дочерний элемент</p>";
                if(!isset($count_level[$n])){$count_level[$n]=0;}
                    //запись в объект количества чайлдов
                    $count_levl=count($mas_element[$n]->$el_chlds->KEY);
                    $obj_el[$glob_i]->count_chld=$count_levl;
                    
                    $element_new=$mas_element[$n]->$el_chlds->KEY[0];
                    $count_level[$n]=$count_level[$n]+1;
                    //переход к значениям для перехода на уровень ниже
                    $n++;
                    $glob_i++;
                    
                    $count_lev[$n]=count($mas_element[$n-1]->$el_chlds->KEY);
                    $count_level[$n]=0;
                    $mas_element[$n]=$element_new;
                    $this->xml_to_object($xml,$mas_element,$element_new,$count_level,$count_lev,$pref);
            }
            //Если дочерних элементов нет
            else{
                
                // добавление элементов того же уровня
                if($count_lev[$n]-1>$count_level[$n]){
                    $glob_i++;
                    $count_level[$n]=$count_level[$n]+1;
                    //Новый элемент должен стать того же уровня, то есть как дочерний от такого же  родителя
                    if(isset($mas_element[$n-1]->$el_chlds->KEY[$i+1])){
                        $element_new=$mas_element[$n-1]->$el_chlds->KEY[$i+1];
                        $mas_element[$n]=$element_new;
                        $this->xml_to_object($xml,$mas_element,$element_new,$count_level,$count_lev,$pref);
                    }
                }
                //переход на элементы уровня выше
                else{
                    if($n>0){
                        $nn=$n;
                        for($k=$n-1;$k>=0;$k--){
                            $glob_i++;
                            if($n>0){
                                $n--;
                                $i_lev=$count_level[$k];
                                //---------------------- переходим на элемент ненулевого уровня
                                if(isset($mas_element[$k-1]->$el_chlds->KEY[$i_lev])){
                                    $element_new=$mas_element[$k-1]->$el_chlds->KEY[$i_lev];
                                    $mas_element[$k]=$element_new;
                                    $this->xml_to_object($xml,$mas_element,$element_new,$count_level,$count_lev,$pref);
                                }
                                //---------------------------- переход на элемент нулевого уровня
                                if($n==0){
                                    $cc=$count_level[$k];
                                    //если существуют ещё элементы нулевого уровня
                                    if(isset($xml->PARAMS->KEY[$cc])){
                                        $element_new=$xml->PARAMS->KEY[$cc];
                                        $mas_element[$n]=$element_new;
                                        $this->xml_to_object($xml,$mas_element,$element_new,$count_level,$count_lev,$pref);
                                    }
                                    else{
                                        return $obj_el;
                                    }
                                }

                                                            
                            }
                            else{
                                return $obj_el;
                            }
                        }
                    }
                    else{
                        print "<p><b><font color='red'>ВЫХОД2!!!</font></b></p>";
                        return $obj_el;
                    }
                }    
            }
            print "<p><b><font color='red'>ВЫХОД3!!!</font></b></p>";
            return $obj_el;
        }
        
    }
    


Добавлено через 1 минуту и 24 секунды
Могу привести пример XML из файла.

Добавлено через 3 минуты и 42 секунды
забыла написать, что в возвращаемом объекте для каждого элемента прописано количество Child из XML, то есть объект содержит не только id и name xml-элементов
PM MAIL   Вверх
Raily
Дата 2.11.2011, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



Цитата(CruorVult @ 1.11.2011,  12:04)
Цитата(Raily @  1.11.2011,  11:54 Найти цитируемый пост)
как работает return


return должен выйти из текущей рекурсивной процедуры, но если запущены еще другие - то соответсвенно продолжится выполнения. Т.к. весь код не приведен - то сказать точно, что не так не могу.

У меня вопрос по поводу "текущей рекурсивной процедуры" - а как определить их количество? К примеру - рекурсия запустила саму себя 5 раз, у меня получается 5 текущих рекурсивных процедур? 

Нашла ошибку! Спасибо, что навели меня на мысль!!!  smile 

Это сообщение отредактировал(а) Raily - 2.11.2011, 12:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.