2010-05-03 5 views
12

Возможно ли иметь функцию в PHP, которая принимает 1 или более номеров и возвращает их сумму?Может ли функция принимать неопределенное количество аргументов?

+0

Возможный дубликат [Доступ к неопределенным аргументам] (http://stackoverflow.com/questions/1151053/accessing-undefined-arguments) – PhoneixS

ответ

18

Вы можете использовать функции func_num_args и func_get_arg как:

function sum() { 
     for($i=0,$sum=0;$i<func_num_args();$i++) { 
       $sum += func_get_arg($i); 
     } 
     return $sum; 
} 

И вызовите функцию, как:

echo sum(1);  // prints 1 
echo sum(1,2);  // prints 3 
echo sum(1,2,3); // prints 6 
0
function sum($args) { 
    $total = 0; 
    foreach($args as $num) { 
    $total += $num; 
    } 
    return $total; 
} 

$args является массив, который вы можете создать так:

$args = array(3, 4, 5, 6);

+0

Для этого используется array_sum(). –

+0

Я предпочитаю использовать «function sum (array $ args) {}», поскольку он устраняет необходимость проверки, действительно ли у вас массив. – dbemerlin

5

Посмотрите на func_get_args(). Он возвращает массив, содержащий все аргументы, переданные функции, в основном именно то, что вы хотите.

Вы можете использовать func_num_args() для прямого получения количества аргументов.

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

Это тривиален, а нереальный, пример показывает преимущество:

// By passing an array to the function 
function add1($nums) 
{ 
$res = 0; 
foreach($nums as $n) 
{ 
     $res += $n; 
} 
return $res; 
} 
add1(array(1, 2, 3, 4)); 

// Using func_get_args() 
function add2() 
{ 
$res = 0; 
foreach(func_get_args() as $n) 
{ 
     $res += $n; 
} 
return $res; 
} 
add2(1, 2, 3, 4); 

add2() явно проще в использовании и звонки на него являются более читаемыми в этом случае.

Решение, приведенное выше, является общим о том, как получить функцию для принятия произвольного количества аргументов. Если ваша проблема связана только с добавлением некоторых чисел, используйте array_add(), как указывали другие ответы.

2

Да.

<?php 
function sum(){ 
    $args = func_get_args(); 
    $sum = 0; 
    foreach($args as $arg){ 
    if(is_numeric($arg)){ 
     $sum += $arg; 
    } 
    } 
    return $sum; 
} 

echo sum().'<br/> 
'.sum(1,2,3,"4", "5.63"); 
6

Да, это

function sum() { 
    $args = func_get_args(); 
    return array_sum($args); 
} 

echo sum(1, 2, 3, 4); 

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

function mapargs() { 
    $args = func_get_args(); 
    return call_user_func(array_shift($args), $args); 
} 

echo mapargs('array_sum', 1, 2, 3, 4); 

или сделать currified списков параметров картографа-обертка из его

function mapify($func) { 
    return function() use($func) { 
     $a = func_get_args(); 
     return call_user_func($func, $a); 
    }; 
} 

$sum = mapify('array_sum'); 
echo $sum(1, 2, 3, 4); 

надеюсь это поможет!

+1

Очень крутой ответ. 'function() use ($ func) {}' Это новый материал лямбды в 5.3? –

0

Функциональный способ:

function fold($step, $acc, $nums) { 
    $val = array_pop($nums); 
    if (isset($val)) { 
    $acc = call_user_func($step, $val, $acc); 
    return fold($step, $acc, $nums); 
    } else { 
    return $acc; 
    } 
} 

function add($a, $b) { 
    return $a + $b; 
} 

function sum($args) { 
    return fold('add',0,$args); 
} 
3

В PHP 5.6 и позже вы сможете сделать это таким образом:

function sum(...$nums) { 
    for($i=0,$sum=0;$i<count($nums);$i++) { 
    $sum += $nums[$i]; 
    } 
    return $sum; 
} 

Или упрощена с помощью Еогеасп:

function sum(...$nums) { 
    $sum=0; 
    foreach($nums as $num) { 
    $sum += $num; 
    } 
    return $sum; 
} 

Источник : PHP Manual: Function arguments

Смежные вопросы