Функция с n параметрами

uchenik

Новичок
Функция с n параметрами

Есть функция, которая принимает несколько параметров и одинаково обрабатывает каждый из них. Количество параметров при разных вызовах функции будет разным - может 1, а может и 10.

Не хочется писать в функции 10 раз один и тот же код для обработки всех возможных параметров. Проще написать цикл с использованием func_num_args() и func_get_args(), но есть проблема - параметры в мою функцию передаются по ссылке и этот способ не работает.

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

tony2001

TeaM PHPClub
>но есть проблема - параметры в мою функцию передаются по ссылке и этот способ не работает.
и в чем проблема?
 

uchenik

Новичок
Пример:

$one = 1;
$two = 2;

function func(&$one, &$two)
{
$num = func_num_args();
$kf = func_get_args();

for($i=0; $i<$num; $i++)
{
$kf[$i] = $kf[$i] + 1; // увеличиваем параметр на единицу

echo $kf[$i]."<br>"; // 1-й вывод
}
}

func($one, $two);

echo $one.'<br>'.$two; // 2-й вывод

1-й вывод показывает:

2
3

2-й вывод показывает:

1
2

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

UNREALre

Новичок
Что-то я вообще не понял, в чём твоя проблема?
Как ты вызываешь функции? Ты хочешь, чтобы вторая тебе тоже выводила 2 и 3 or smth?
 

tony2001

TeaM PHPClub
ага, понял.
это неудивительно, т.к. func_get_args() возвращает копию, а не ссылку.
передавай массив аргументов.
 

uchenik

Новичок
Автор оригинала: Tsatur
Ты хочешь сказать, что функция неправильно выводит данные? Хм... а я всегда думал, что 1+1=2 и 2+1=3...
Первый вывод - это вывод внутри функции.
Второй вывод - это вывод вне тела функции.

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

А как их передать по ссылке в эту функцию я не знаю.
 

Tsatur

Guest
Понятно... тогда смотри, что предложил tony2001
 

uchenik

Новичок
Автор оригинала: tony2001
ага, понял.
это неудивительно, т.к. func_get_args() возвращает копию, а не ссылку.
передавай массив аргументов.
Так тоже не получится.

Моя функция вызывается в цикле и в качестве параметров получает элементы двумерных массивов:

func($arr[0][$i], $arr[3][$i], .... и т.д.);

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

Но делать это периодически в цикле с сотней итераций будет очень коряво.

Нужно другое решение.
 

Tsatur

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

tony2001

TeaM PHPClub
>Но делать это периодически в цикле с сотней итераций будет очень коряво.
то, что ты делаешь - и так очень "коряво".
поэтому, я не вижу смысла избегать нормального решения и искать еще более "корявое".
 

Фанат

oncle terrible
Команда форума
А функция точно нужна?
её нельзя оформить куском кода внутри цикла?
Вообще, задачка какая-то высосанная из пальца.
 

uchenik

Новичок
Автор оригинала: Фанат
А функция точно нужна?
её нельзя оформить куском кода внутри цикла?
Вообще, задачка какая-то высосанная из пальца.
Хорошо обьясняю подробнее и по пунктам:

1. Сценарий выполняет определенные действия, результатом которых являются несколько двумерных массивов одинакового размера. Откуда берутся эти массивы - результат выборки из базы данных и результат работы рег. выражений - не важно, так как не имеет отношения к вопросу.

К примеру получено 10 массивов - $arr[0][], $arr[1][], $arr[2][] ... и т.д.

7 из них имеют наборы числовых данных, именно эти массивы мне нужно обработать. К примеру к каждому числу добавить единицу. Важно! - преобразования элементов всех массивов всегда одинаковы, то есть единица будет прибавлятся ко всем элементам всех 7 массивов.

2. Запускаю цикл

for($i=0; $i<sizeof($arr[0]); $i++)
{

3. На каждой итерации цикла мне нужно обработать по 1 элементу из всех 7 массивов.

Вариант №1 - я пишу функцию, которая будет принимать 1 параметр и просто вызваю ее 7 раз:

func(&$arr[0][$i]);
func(&$arr[2][$i]);
func(&$arr[5][$i]);
......

Вариант №2 - вызываю функцию 1 раз:

func(&$arr[0][$i], &$arr[2][$i], &$arr[5][$i] .... и т.д.);

а сама функция, будет принимать все 7 параметров и выглядеть так:

func(параметры)
{
<набор действий над 1-м параметром>
<набор действий над 2-м параметром>
<набор действий над 3-м параметром>
.....

}

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

Проблема вторая - при реальной работе сценария может быть создано от 1 до 10 массивов, которые нужно обработать.
Представте ситуацию: цикл с сотней итераций, имеется лишь 1 массив для обработки. Я воспользуюсь Вариантом №1 и для каждой итерации буду 10 раз функцию:

func(&$arr[0][$i]);
func(&$arr[2][$i]);
func(&$arr[5][$i]);
......

При этом девять вызовов будут работать в холостую.

Вот такая проблема...


Я хотел сделать так:

func(&параметры)
{
for($i=0; $i<количества параметров; $i++)
{
<набор действий над i-м параметром>
}
}

Но из-за передачи параметров по ссылке возникли проблемы
 

che

Guest
Укачивай результат в массив и возвращай его. Пользуй функцию как функцию а не как процедуру. Если на выходе нужно n массивов - экстракт.
 
Сверху