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

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);
 

.des.

Поставил пиво кому надо ;-)
Пока нормальными методами 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;
   }
}
 

GL

Guest
согласен8(
хорошо было бы как в яве,
там можно создать сколько угодно методов в классе, называющихся одинаковыми именами, но с различным кол-вом аргументов.
 

.des.

Поставил пиво кому надо ;-)
а можно спросить зачем? это что так уж жизненно важно?
 

hawk

Guest
А почему бы массив со ссылками на переменые не передать?
 

SergioM

Guest
Блин... надо до конца читать, только что пришла та же мысль, что и hawk ;)), даже код набросал, уже собрался пост с умными мыслями накатать... ан нет, опередили...
короче этот вариант (от hawk) тебе поможет...
 

rembo

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

.des.

Поставил пиво кому надо ;-)
rembo ты это принципиально против ссылок? Вообще ссылки для экономии машинных ресурсов. Но только их надо грамотно использовать.
 

fog

Рыцарь Джедай
rembo, мне нужно изменять переменные за пределами функции, поэтому ссылки.
 

fog

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

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

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

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);
и получить изменённые переменные

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

.des.

Поставил пиво кому надо ;-)
fog не надо множить топики!!!

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

И вообще тебе предложили два решения - один ограничение -максимально N элементов в прошлом топике (очень редко когда надо больше скажем 10 параметров.)
Если же надо действительно много, тогда этот с массивом.
Обсуждать больше нечего.
 

fog

Рыцарь Джедай
Да, array неудобно, ведб не просто array, а ещё и ампресанды ставить :) Ограничение тоже не подходит...
 

.des.

Поставил пиво кому надо ;-)
Вот и подумай в следующий раз перед тем как множить топики был бы один тред.. в нем бы скорее всего велись обсуждения.. а так путаница какая то и решения ты не дождешься...

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

fog может быть ты изначальную задачу скажешь.. а то мне кажется ее можно было решить другим способом..
например все тот же массив передавать и возвращать (return) измененный массив.
 

fog

Рыцарь Джедай
затача проста. в функцию добавления новости/статьи/... передаются какие-то данные: $title, $text, $some

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

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

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

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

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

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

// переменные уже обработаны
 

.des.

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

[deleted]
Точно.. это не то.
 

fog

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

.des.

Поставил пиво кому надо ;-)
Так сработает. Но лично я бы делал неудобно с массивом.

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);  
// переменные уже обработаны
 

fog

Рыцарь Джедай
Хех, мда :) Так заработало конечно. Вобщем. Ты меня переубедил, буду делать через массив. Спасибо за помощь :)
 
Сверху