2010-05-03 8 views

Respuesta

18

se puede hacer uso de la función func_num_args y func_get_arg como:

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

Y llama a la función como:

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 es una matriz, que puede crear de esta manera:

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

+0

Para eso es para array_sum(). –

+0

Prefiero usar "función suma (matriz $ args) {}" ya que elimina la necesidad de verificar si realmente tienes una matriz. – dbemerlin

3

qué pasa simplemente de paso matriz?

5

Eche un vistazo a func_get_args(). Devuelve una matriz que contiene todos los argumentos pasados ​​a la función, básicamente exactamente lo que quiere.

Puede usar func_num_args() para recibir directamente el número de argumentos.

Sin embargo, tenga en cuenta que, en la mayoría de los casos, es mejor pasar una matriz a la función. Las funciones anteriores están pensadas para casos especiales donde es más fácil y/o más legible no crear y pasar matrices directamente a la función.

Este trivial, poco realista, ejemplo muestra las ventajas:

// 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() es claramente más fácil de usar y las llamadas a que son más legibles en este caso.

La solución anterior es general sobre cómo hacer que una función tome una cantidad arbitraria de argumentos. Si su problema es realmente solo sumar algunos números, use array_add() como se indicó en las otras respuestas.

2

Sí.

<?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

sí, es

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

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

Puede también más abstracta esta noción de ser capaz de envolver cualquier función de matriz

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

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

o hacer una currified varargs asignador de envoltura de es

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

¡espero que esto ayude!

+1

Muy buena respuesta. 'function() use ($ func) {}' ¿Es este el nuevo material lambda en 5.3? –

0

manera funcional:

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

En PHP 5.6 y más tarde usted será capaz de hacerlo de esta manera:

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

O simplificada usando foreach:

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

Fuente : PHP Manual: Function arguments

Cuestiones relacionadas