Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2010, 05:28   #1
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
Вопрос Возврат переменных из цикла и функций

Здравствуйте. Собственно сабж.

PHP код:
<?
function funktsiya($period)
   {
      
$a=1;                              //вернуть нужно эту
      
$b=2+$a;                         //эту
      
$x=0;
         while(
$x!=$period)
            {
               
$bla_bla=$b+$a+$x*2;    //и это значение для каждой итерации
               
$masiv_bla_bla=array($x=>$bla_bla);   // попробуем записать в массив
                  
echo "<br>".$masiv_bla_bla[$x];        //массив катит только в цикле. Тут проще сделать тогда вообще так echo "<br>".$bla_bla=$b+$a+$x*2;
               
$x++;                                            //return вообще останавливает всю функцию и цикл. Тоже не катит...
            
}                                                     //да и ретурном нельзя вывести несколько значений :(
echo $masiv_bla_bla[5]."<br>";                       //тут за циклом масив обнуляется и значение это не выводится... ;-(((
   
}
$period=10;
funktsiya($period);

echo 
$a;//данные не отображаются.
echo $b;//


?>
каким образом можно вернуть значения каждой отмеченной переменной, и можно ли это вообще? имхо гугл в этом вопросе не рулит.

Последний раз редактировалось %$PROregRAMi$t%; 29.08.2010 в 06:21.
%$PROregRAMi$t% вне форума Ответить с цитированием
Старый 29.08.2010, 06:18   #2
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
По умолчанию

Пол задачи уже решил:
PHP код:
<?
function funktsiya($period)
   {
      
$a=1;                              
      
$b=2+$a;                         
      
$x=0;
      
$masiv_bla_bla=array();     //тут задал массив как нулевой
         
while($x!=$period)
            {
               
$bla_bla=$b+$a+$x*2;    
               
$masiv_bla_bla=$masiv_bla_bla+array($x=>$bla_bla);   //а здесь добавляем данные с каждой итерацией в предыдущий массив
               
$x++;                                            
            }                                                    
echo 
$masiv_bla_bla[5]."<br>";                       //теперь тут выводится значение из полученного массива, а значит данные уже выведены за пределы цикла.

/*есть идея - вывести все данные в виде одного многомерного
массива return`om.


Мой вопрос теперь приобретает другой характер.
Как правильно создать многомерный массив из переменных,
в которые объявлены как массивы?!!
И как правильно к ним обращатся?!!*/

            
$massiv_vsex_dannyx=array(masiv_bla_bla=>$masiv_bla_bla,     a=>$a,    b=>$b); // пытаюсь создать многомерный массив.
if(isset($massiv_vsex_dannyx)){echo"массив существует"; return $massiv_vsex_dannyx;}else{echo"Массив не существует";} //проверяю есть ли массив. //Результат - массив существует, и функция должна возвращать его.
   
}

if(isset(
$massiv_vsex_dannyx)){echo"массив задан";}else{echo"Массив не задан";}
/*однако тут массив не задан..... надо зубрить ассемблер))))*/

$period=10;
funktsiya($period);
echo 
$massiv_vsex_dannyx[a];    //данные не отображаются.
echo $massiv_vsex_dannyx["b"];    //так тоже
echo $massiv_vsex_dannyx[masiv_bla_bla][5]; //тоже ничего.

?>
Разобравшись в деталях, понял, что $masiv_bla_bla не является самим массивом, а является ссылкой на массив полученный из цикла. Поэтому при создании $massiv_vsex_dannyx с использованием $masiv_bla_bla переменная массива $massiv_vsex_dannyx создается, но сам массив некоректен.

Вопрос сводится к сабжу. Какие могут быть еще варианты решения задачи? Также просьба указать мои ошибки...

Последний раз редактировалось %$PROregRAMi$t%; 29.08.2010 в 07:17.
%$PROregRAMi$t% вне форума Ответить с цитированием
Старый 29.08.2010, 20:08   #3
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Цитата:
имхо гугл в этом вопросе не рулит
ну это смотря как спрашивать - то, что тебе нужно называется передачей параметра по ссылке. После ознакомления с приведенной теорией читаем как это реализуется в php.

Ошибки поправлять не буду, ибо не стал вчитываться в код, но... это конечно жесть... таким способом добавлять переменные в массив.
PHP код:
         $masiv_bla_bla = array();    
         while(
$x!=$period)
         {
               
$masiv_bla_bla=$masiv_bla_bla+array($x=>$bla_bla);   // это не добавление элементов, а слияние массивов
               
...                       
         }       


         
// лучше вот так:
         
$masiv_bla_bla = array();    
         while(
$x!=$period)
         {
               
$masiv_bla_bla[$x] = $bla_bla;  // Если просто список, тогда вот так: $masiv_bla_bla[] = $bla_bla; 
               
...                       
         } 

И раз автор интересуется другими вариантами решения задачи, то подскажу (эта мысль уже прозвучала) - если из функции требуется вытащить несколько переменных, то в теле функции упаковываем необходимые переменные в массив, return, распаковываем (особенно актуально, если заранее не известно какие именно переменные возвратятся), для чего используются функции compact() и extract().
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.

Последний раз редактировалось InternetStranger; 29.08.2010 в 20:22.
InternetStranger вне форума Ответить с цитированием
Старый 29.08.2010, 20:36   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,219
По умолчанию

Проще всего вернуть в виде ассоциативного массива.
Arigato вне форума Ответить с цитированием
Старый 29.08.2010, 20:56   #5
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Проще всего вернуть в виде ассоциативного массива.
Чем, собственно, и занимается функция compact( )
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Старый 30.08.2010, 03:52   #6
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
Хорошо

Фух... Проспался немного и решил задачу. Как говорят в народе: "Утро вечера - мудреннее."

PHP код:
<?

function funktsiya($period)
   {
      
$a=1;                              
      
$b=2+$a;                         
      
$x=0;
      
$masiv_bla_bla=array();     //тут задал массив как нулевой
         
while($x!=$period)
            {
               
$bla_bla=$b+$a+$x*2;    
               
$masiv_bla_bla=$masiv_bla_bla+array($x=>$bla_bla);   //а здесь добавляем данные с каждой итерацией в предыдущий массив
               
$x++;                                            
            }                                                    
       echo 
implode(', '$masiv_bla_bla);                       //теперь тут выводится значение из полученного массива, а значит данные уже выведены за пределы цикла.
       
$massiv_vsex_dannyx=array(masiv_bla_bla=>$masiv_bla_bla,     a=>$a,    b=>$b); // создаю многомерный массив
       
return $massiv_vsex_dannyx//возвращаю из функции значение многомерного массива
    
}



$period=10;
$massiv_vsex_dannyx=funktsiya($period);  //Тут исправил свою ошибку!!! Нужно было определить массив как глобальную переменную, со значением массива возвращенного функцией
if(isset($massiv_vsex_dannyx)){echo"<BR>массив задан";}else{echo"<BR>Массив не задан";} //проверяю, определен ли многомерный массив вне функции

echo "<br><br>Выродим все данные из многомерного массива:<br>".implode('<br>',$massiv_vsex_dannyx); //первая строка результата - массив. Массив многомерен.
echo "<br><br>Выводим все данные из вложенного массива:<br>".implode('<br>',$massiv_vsex_dannyx["masiv_bla_bla"]);//просматриваем данные во вложенном массиве.

echo '<br><br>Вывожу значение произвольной переменной во вложенном массиве:<br>$massiv_vsex_dannyx[masiv_bla_bla][5] = '.$massiv_vsex_dannyx[masiv_bla_bla][5];
echo 
'<br><br>Вывожу значение переменной из многомерного массива<br>$massiv_vsex_dannyx[a] = '.$massiv_vsex_dannyx[a];

/*Задача решена!*/
?>





Цитата:
Сообщение от InternetStranger Посмотреть сообщение
ну это смотря как спрашивать - то, что тебе нужно называется передачей параметра по ссылке. После ознакомления с приведенной теорией читаем как это реализуется в php.
А ты хоть сам RTFM ЭТО и ЭТО???

Если да - то какое отношение это имеет к решению задачи? Вопрос был вывести данные из функции а не ввести их как параметр.
Я передал параметр, или аргумент как он еще называется - еще здесь:
Цитата:
Сообщение от %$PROregRAMi$t% Посмотреть сообщение
PHP код:
<?
...
function 
funktsiya($period)
...
funktsiya($period);

//Это цитата из первого примера кода
?>
Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Ошибки поправлять не буду, ибо не стал вчитываться в код, но... это конечно жесть... таким способом добавлять переменные в массив.
PHP код:
         $masiv_bla_bla = array();    
         while(
$x!=$period)
         {
               
$masiv_bla_bla=$masiv_bla_bla+array($x=>$bla_bla);   // это не добавление элементов, а слияние массивов
               
...                       
         } ... 
Как можно давать какие либо советы, если ты даже в код не вчитался?!!
Для чего я его тогда тут вообще повешал если его не читают?
Хоть мой вариант и жесток, но тем не менее он тоже работает.
Цитата:
Сообщение от %$PROregRAMi$t% Посмотреть сообщение
PHP код:
...
      
$masiv_bla_bla=array();     //тут задал массив как нулевой
         
while($x!=$period)
            {
               
$bla_bla=$b+$a+$x*2;    
               
$masiv_bla_bla=$masiv_bla_bla+array($x=>$bla_bla);   //а здесь добавляем данные с каждой
//итерацией в предыдущий массив
//путем слияния массивов (т. е. результат все тот же.)
               
$x++;                                            
            }
/*Если хочешь - можешь проверить полученный массив
выводом данных из него:*/
echo implode(', ',$masiv_bla_bla);
... 
Цитата:
Сообщение от InternetStranger Посмотреть сообщение
PHP код:
...        // лучше вот так:
         
$masiv_bla_bla = array();    
         while(
$x!=$period)
         {
               
$masiv_bla_bla[$x] = $bla_bla;  // Если просто список, тогда вот так: $masiv_bla_bla[] = $bla_bla; 
               
...                       
         } 
За альтернативу благодарю.

Последний раз редактировалось %$PROregRAMi$t%; 30.08.2010 в 04:05.
%$PROregRAMi$t% вне форума Ответить с цитированием
Старый 30.08.2010, 03:53   #7
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
По умолчанию

Вот тут я заблуждался:
Цитата:
Сообщение от %$PROregRAMi$t% Посмотреть сообщение
Пол задачи уже решил:
PHP код:
<?
...

if(isset(
$massiv_vsex_dannyx)){echo"массив задан";}else{echo"Массив не задан";}
/*однако тут массив не задан..... надо зубрить ассемблер))))*/

$period=10;
funktsiya($period);/////////////////////////////////////////ТУТ ОШИБКА. правильно вот так $massiv_vsex_dannyx=funktsiya($period);
echo $massiv_vsex_dannyx[a];    //данные не отображаются.
echo $massiv_vsex_dannyx["b"];    //так тоже
echo $massiv_vsex_dannyx[masiv_bla_bla][5]; //тоже ничего.

?>
Разобравшись в деталях, понял, что $masiv_bla_bla не является самим массивом, а является ссылкой на массив полученный из цикла. Поэтому при создании $massiv_vsex_dannyx с использованием $masiv_bla_bla переменная массива $massiv_vsex_dannyx создается, но сам массив некоректен... и бла бла бла...

На самом деле массив нормально возвращался функцией, но он не присваивался никакой переменной.




Цитата:
Сообщение от InternetStranger Посмотреть сообщение
И раз автор интересуется другими вариантами решения задачи, то подскажу (эта мысль уже прозвучала) - если из функции требуется вытащить несколько переменных, то в теле функции упаковываем необходимые переменные в массив, return, распаковываем (особенно актуально, если заранее не известно какие именно переменные возвратятся), для чего используются функции compact() и extract().
Цитата:
Сообщение от Arigato Посмотреть сообщение
Проще всего вернуть в виде ассоциативного массива.
Спасибо с помощью ваших советов сделал код компактнее и вывел сами переменные в виде ассоциативного массива, а затем вообще в виде переменного числа переменных, обходя многомерный массив!!!
PHP код:
<?
function funktsiya($period)
   {
      
$a=1;                              
      
$b=2+$a;                         
      
$x=0;

         while(
$x!=$period)
            {
               
$bla_bla=$b+$a+$x*2;    
//тут создается ассоциативный массив с индексами от x0 до x($period`ного).
//Иначе если массив будет числовой функция extract не даст желаемого результата,
//так как переменные не могут быть числами.
               
$masiv_bla_bla["x$x"] = $bla_bla;   
               
$x++;                                            
            }
       
$massiv_vsex_dannyx=compact(a,b)+$masiv_bla_bla;//сливаем два массива со значениями всех полученных из функции переменных в один массив
       
return $massiv_vsex_dannyx//возвращаем из функции его значение
    
}



$period=10;
$massiv_vsex_dannyx=funktsiya($period);            //определяем глобальную переменную как возвращенный функцией массив
if(isset($massiv_vsex_dannyx)){echo"<BR>массив задан";}else{echo"<BR>Массив не задан";} //проверяем задан ли массив
extract($massiv_vsex_dannyx);        //извлекаем переменные и их значения из массива
echo "<br><br>$a<br>";
echo 
"$b<br>";
echo 
"$x0<br>";
echo 
"$x1<br>";
echo 
"$x2<br>";                        // и делаем с ними че хотим там...
//задача решена!
?>
Может кому-то будет полезна эта тема. Кто хочет - предложите свои варианты кода покомпактнее, ток без флуда...
Все всем спасибо за внимание. пока пока

Последний раз редактировалось %$PROregRAMi$t%; 30.08.2010 в 09:21.
%$PROregRAMi$t% вне форума Ответить с цитированием
Старый 30.08.2010, 11:59   #8
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

PHP код:
<?php
function make_array($period)
   {
      
define ("CONST_A"1);
      
define ("CONST_B"2+CONST_A);

      
$x=0;

         while(
$x!=$period)
            {
               
$period_array[]=CONST_B+CONST_A+$x*2;
               
$x++;
            }
       return 
$period_array//возвращаем из функции его значение
    
}

$period=10;
$main_array=make_array($period);            //определяем глобальную переменную как возвращенный функцией массив
if(isset($main_array)){echo"<BR>массив задан";}else{echo"<BR>Массив не задан";} //проверяем задан ли массив
echo '<br><br>'.CONST_A.'<br>';
echo 
CONST_B.'<br>';
foreach (
$main_array as $ket=>$value) {
    echo 
$value.'<br>';
}
?>
И никаких бредов с компактами и экстрактами. Вам очень, очень, очень, ну просто ОЧЕНЬ нужно подучить теорию программирования. С таким кодом, который вы делаете, вас будут называть "индусом" или "китайцем". Это один из самых плохих кодов, который я когда-либо видел, и что самое плохое, Вы не хотите учиться делать это правильно. А жаль.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?

Последний раз редактировалось Johnatan; 30.08.2010 в 12:01.
Johnatan вне форума Ответить с цитированием
Старый 31.08.2010, 05:22   #9
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
По умолчанию

Цитата:
Сообщение от Johnatan Посмотреть сообщение
PHP код:
<?php
function make_array($period)
   {
      
define ("CONST_A"1);
      
define ("CONST_B"2+CONST_A);

      
$x=0;

         while(
$x!=$period)
            {
               
$period_array[]=CONST_B+CONST_A+$x*2;
               
$x++;
            }
       return 
$period_array//возвращаем из функции его значение
    
}

$period=10;
$main_array=make_array($period);            //определяем глобальную переменную как возвращенный функцией массив
if(isset($main_array)){echo"<BR>массив задан";}else{echo"<BR>Массив не задан";} //проверяем задан ли массив
echo '<br><br>'.CONST_A.'<br>';
echo 
CONST_B.'<br>';
foreach (
$main_array as $ket=>$value) {
    echo 
$value.'<br>';
}
?>
И никаких бредов с компактами и экстрактами. Вам очень, очень, очень, ну просто ОЧЕНЬ нужно подучить теорию программирования. С таким кодом, который вы делаете, вас будут называть "индусом" или "китайцем". Это один из самых плохих кодов, который я когда-либо видел, и что самое плохое, Вы не хотите учиться делать это правильно. А жаль.
ООО!! спасибки джонатан! код вообще супер.
Я же говорю, что я проспался, и решил задачу не глядя на форум, тупо своими силами и получил желаемый результат, хоть и кодил просто жестко...
Но это лучше чем ничего, при том что я тупил и в упор ошибку не видил свою.
Главное - это же ведь решить задачу?! или я ошибаюсь?

Почему же не хочу учится? Хочу! Вон ниже моего первого варианта применил советы InternetStranger и Arigato, и запомнил пару функций... Сейчас запомнил синтаксис новой для меня функции дефайн...
И если не трудно - скиньте ссыль на теорию программирования.
Благодарю.

Последний раз редактировалось %$PROregRAMi$t%; 31.08.2010 в 05:39.
%$PROregRAMi$t% вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение графиков функций С++ (методы аппроксимации функций) amdbodia Общие вопросы C/C++ 0 24.05.2009 15:28
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27
использование функций в качестве параметров других функций mono Помощь студентам 0 20.04.2009 18:25
Разработка программ с использованием функций. Табулирование функции одного и двух переменных кася Паскаль, Turbo Pascal, PascalABC.NET 5 07.05.2008 20:11
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10