Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Подскажите с аргументами функции

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Передача необязательных аргументов
UNTRUSTED
Отправлено: 19 Апреля, 2012 - 18:42:00
Post Id


Частый гость


Покинул форум
Сообщений всего: 255
Дата рег-ции: Март 2012  


Помог: 2 раз(а)




PHP:
скопировать код в буфер обмена
  1. function Foo($a,$b=1,$c=2,$d=3){...};
  2.  
  3. if(!empty($_POST['b'])){$b=$_POST['b'];}
  4. if(!empty($_POST['c'])){$c=$_POST['c'];}
  5. if(!empty($_POST['d'])){$d=$_POST['d'];}
  6.  
  7. Foo($a,isset($b),isset($c),isset($d));

Как сделать что-то подобное, так не правильно, так как isset() передаст либо true либо false! Это для примера, чтобы было понятно что нужно! Т.е. что если нет переменной, то используется по умолчанию!
Есть один вариант, но он убогий!
(Добавление)
А еще скажите пожалуйста, можно ли делать вот так?
PHP:
скопировать код в буфер обмена
  1. function Foo($x,$y,$z='')
  2. {
  3.   ...
  4.   ....
  5.   $a=...;
  6.   ....
  7.   if(!empty($z))
  8.   {
  9.     Foo($a);
  10.   }
  11.   ...
  12.   ...
  13. }

Т.е. вызывать в функции саму себя!
 
 Top
EuGen Администратор
Отправлено: 19 Апреля, 2012 - 19:10:02
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. $rgNames  = array('b', 'c', 'd');
  2. $rgParams = array();
  3. foreach($rgNames as $sName)
  4. {
  5.    if(!empty($_POST[$sName]))
  6.    {
  7.       $rgParams[]=$_POST[$sName];
  8.    }
  9. };
  10. $mResult=call_user_func_array('Foo', $rgParams);

?


UNTRUSTED пишет:
Т.е. вызывать в функции саму себя!

Можно. Этому есть название - рекурсия. Но нужно позаботиться о том, чтобы она не была бесконечной и при наступлении некоторого условия она прекращалась.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
UNTRUSTED
Отправлено: 19 Апреля, 2012 - 19:16:20
Post Id


Частый гость


Покинул форум
Сообщений всего: 255
Дата рег-ции: Март 2012  


Помог: 2 раз(а)




Большое спасибо!!!
EuGen пишет:
чтобы она не была бесконечной

Ну, насчет бесконечности скоро проверимУлыбка
(Добавление)
EuGen пишет:
$mResult=call_user_func_array('Foo', $rgParams);

А он их в нужном порядке поставит?
Например если b пусто, он не поставит c на место b?

(Отредактировано автором: 19 Апреля, 2012 - 19:25:03)

 
 Top
EuGen Администратор
Отправлено: 19 Апреля, 2012 - 19:28:56
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




UNTRUSTED
Аргументы будут в том порядке, в котором Вы укажете их в $rgNames (очевидно, он для этого и создан)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
UNTRUSTED
Отправлено: 19 Апреля, 2012 - 19:35:00
Post Id


Частый гость


Покинул форум
Сообщений всего: 255
Дата рег-ции: Март 2012  


Помог: 2 раз(а)




UNTRUSTED пишет:
Например если b пусто, он не поставит c на место b?

Да, так и делаетНедовольство, огорчение
(Добавление)
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function Foo($a,$b,$c){
  3.   var_dump($a);var_dump($b);var_dump($c);
  4. }
  5. $rgNames  = array('a','b','c');
  6. $rgParams = array();
  7. foreach($rgNames as $sName){
  8.   if(!empty($_POST[$sName])){
  9.     $rgParams[]=$_POST[$sName];
  10.   }
  11. }
  12. $mResult=call_user_func_array('Foo', $rgParams);
  13. ?>
  14. <form method="post">
  15. <input name="a" placeholder="a">
  16. <input name="b" placeholder="b">
  17. <input name="c" placeholder="c">
  18. <input type="submit" value="Проверить">

Вот проверьте сами!
Если пишешь только в одно любое, он все равно в первое подставляет!
(Добавление)
Вот так попробовал
PHP:
скопировать код в буфер обмена
  1. $i=0;
  2. foreach($rgNames as $sName){
  3.   if(!empty($_POST[$sName])){
  4.     $rgParams[$i]=$_POST[$sName];
  5.   }
  6.   $i++;
  7. }

Тоже не катит...
(Добавление)
Есть, я придумал как!
PHP:
скопировать код в буфер обмена
  1. $поумолчанию= array(1,2,3);
  2. $rgNames  = array('a','b','c');
  3. $rgParams = array();
  4. $i=0;
  5. foreach($rgNames as $sName){
  6.   if(!empty($_POST[$sName])){
  7.     $rgParams[$i]=$_POST[$sName];
  8.   }else{
  9.     $rgParams[$i]=$поумолчанию[$i];
  10.   }
  11.   $i++;
  12. }
  13. $mResult=call_user_func_array('Foo', $rgParams);
 
 Top
EuGen Администратор
Отправлено: 19 Апреля, 2012 - 19:53:39
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




UNTRUSTED
Я полагал, что Вы имеете ввиду порядок. Вы же говорите о пустоте промежуточных элементов. Если у Вас предполагается, что аргументы могут быть не точным рядом, заполненным слева, то сделать вызов в автоматическом варианте, я думаю, не получится(то, что написали Вы - не тот случай, ведь Вы перечисляете значения по-умолчанию еще раз отдельно, это совсем не то, как если бы использовались значения из объявления функции) - в php нет именованных параметров. Либо же принимайте в функции один аргумент - массив с парами ключ-значение. Тогда соответствие будет однозначным.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
UNTRUSTED
Отправлено: 19 Апреля, 2012 - 20:06:20
Post Id


Частый гость


Покинул форум
Сообщений всего: 255
Дата рег-ции: Март 2012  


Помог: 2 раз(а)




А повторяться небудет, так как тогда сделать вот так:
PHP:
скопировать код в буфер обмена
  1. function Foo($a,$b,$c,$d)
  2. {
  3.   ...
  4. };
  5.  
  6. $поумолчанию= array('erg',regerg',gerg','');
  7. $rgNames  = array('a','b','c','d');
  8. $rgParams = array();
  9. $i=0;
  10. foreach($rgNames as $sName){
  11.   if(!empty($_POST[$sName])){
  12.     $rgParams[$i]=$_POST[$sName];
  13.   }else{
  14.     $rgParams[$i]=$поумолчанию[$i];
  15.   }
  16.   $i++;
  17. }
  18. echo call_user_func_array('Foo', $rgParams);


Все равно спасибо вам за толчек в нужном направлении! Так бы сам не додумалсяУлыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB