Неопр. количество аргументов ф-ии по ссылке

  • Автор темы Автор темы fog
  • Дата начала Дата начала

fog

Рыцарь Джедай
Неопр. количество аргументов ф-ии по ссылке

Как бы написать функцию, которая будет принимать неопределённое количество значений по ссылке и изменять их?

т.е. функция которая приведена ниже - просто принимает значения, и распечатывает их квадраты, а мне нужно чтобы она изменяла сами переменные $a1 ... $an.

Тоесть понятно как это сделать когда кол-во принимаемых значений заранее определено, просто поставить ампресанты "function my(&$a1, &$a2, &$a3)", а вот как быть с неопределённым количеством значений?

PHP:
function my()
    {
    $args = func_get_args();
    foreach($args as $key=>$val)
        {
        echo $val*$val."<br>";
        }
    }

$a1 = "3";
$a2 = "5";
$a3 = "7";

my($a1, $a2, $a3);
 
Пока нормальными методами php это не позволяет...
одно из решений - что то вроде (ограничение N параметров)
PHP:
function my($a0=NULL,$a1=NULL,....,$aN=NULL)
{
   $i=0;
   $var="a".$i;
   while(!is_null($$var))
   {
        $$var*=$$var;
        $i++;
        $var="a".$i;
   }
}
 
согласен8(
хорошо было бы как в яве,
там можно создать сколько угодно методов в классе, называющихся одинаковыми именами, но с различным кол-вом аргументов.
 
а можно спросить зачем? это что так уж жизненно важно?
 
А почему бы массив со ссылками на переменые не передать?
 
Блин... надо до конца читать, только что пришла та же мысль, что и hawk ;)), даже код набросал, уже собрался пост с умными мыслями накатать... ан нет, опередили...
короче этот вариант (от hawk) тебе поможет...
 
со ссылками на переменые
зачем ссылки? почему нельзя передавать значения? массивы как раз таки и нужны для того чтоб в них хранить однотипные значения, а в пхп еще и неопределенное количество
 
rembo ты это принципиально против ссылок? Вообще ссылки для экономии машинных ресурсов. Но только их надо грамотно использовать.
 
rembo, мне нужно изменять переменные за пределами функции, поэтому ссылки.
 
Передать в ф-ю неогр. количество параметров по ссылке

Рискну написать в раздел для профи, может тут помогут :)

Нужна функция, котороая всего-навсего будет принимать неограниченое количество параметров, как ссыли, и обрабатывать их. Возвращать она ничего не будет, только изменять переданные по ссылке переменные. Единственный вариент которой заработал вот:

PHP:
function my($args)
        {
        for($i=0; $i<sizeof($args); $i++)
                {
                $args[$i] = $args[$i] * $args[$i];	
                }
        }

$a1 = 3;
$a2 = 5;
$a3 = 7;

my(array(&$a1,&$a2,&$a3));

echo "$a1 $a2 $a3";

Но, он неудобен :) Хотелось бы вызывать функцыю просто:

PHP:
my($a1,$a2,$a3);


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

PHP:
function my() 
    { 
    $args = func_get_args(); 
    foreach($args as $key=>$val) 
        { 
	$val = $val*$val; 
        } 
    } 

$a1 = "3"; 
$a2 = "5"; 
$a3 = "7"; 

my($a1, $a2, $a3);


т.е. Это делается затем, чтобы не писать три раза

PHP:
$a1 = my($a1);
$a2 = my($a2);
$a3 = my($a3);

а написать один раз

PHP:
my($a1,$a2,$a3);

и получить изменённые переменные

Можно ли переписать первую функцию так, чтобы она работала и вызывалась удобно? :)
 
fog не надо множить топики!!!

По поводу решения
А что не удобно? слово array написать? Или религия не позволяет?

И вообще тебе предложили два решения - один ограничение -максимально N элементов в прошлом топике (очень редко когда надо больше скажем 10 параметров.)
Если же надо действительно много, тогда этот с массивом.
Обсуждать больше нечего.
 
Да, array неудобно, ведб не просто array, а ещё и ампресанды ставить :) Ограничение тоже не подходит...
 
Вот и подумай в следующий раз перед тем как множить топики был бы один тред.. в нем бы скорее всего велись обсуждения.. а так путаница какая то и решения ты не дождешься...

Да и нет его в твоем случае.. мда уж амперсанды поставить ну дико неудобно. хех

fog может быть ты изначальную задачу скажешь.. а то мне кажется ее можно было решить другим способом..
например все тот же массив передавать и возвращать (return) измененный массив.
 
затача проста. в функцию добавления новости/статьи/... передаются какие-то данные: $title, $text, $some

Там они обрабатываются функцией clear() - замена \n на <br>, htmlspecialchars и так далее.

раньше я писал так:

$title = cleartext ($title);
$text = cleartext ($text);
$some = cleartext ($some);

теперь, я хочу сделать так, чтобы можно было передать в одну функцию все переменные сразу и не мучиться.

// переменнные ещё не обработаны

cleartext ($title,$text,$some);

// переменные уже обработаны
 
Мда.. fog не кажется ли тебе что все таки два предложенных варианта были вполне нормальными для твоей задачи...
сторонник оптимизации млин.

[deleted]
Точно.. это не то.
 
Несработает, для того чтобы это сработало, сюда $GLOBALS[Вот сюда]=... нужно подставить имя глобальной переменной, а $name у нас значение переменной... можно в функции получить имена переданных ей переменных?
 
Так сработает. Но лично я бы делал неудобно с массивом.

PHP:
function cleartext()
{ 
    $args = func_get_args();   
    foreach($args as $name) 
    { 
        //make some action with appropriate GLOBAL variable 
        $GLOBALS[$name]=nl2br($GLOBALS[$name]); 
    }//foreach */
}//cleartext 

$title = "aaa";  
$text = "bbb";  
$some = "ccc";  

// переменнные ещё не обработаны 
@cleartext (title,text,some);  
// переменные уже обработаны
 
Хех, мда :) Так заработало конечно. Вобщем. Ты меня переубедил, буду делать через массив. Спасибо за помощь :)
 
Сверху