tags:

views:

100

answers:

9

Is it possible to have a function in PHP which takes 1 or more numbers and returns their sum ?

+1  A: 
function sum($args) {
  $total = 0;
  foreach($args as $num) {
    $total += $num;
  }
  return $total;
}

$args is an array, which you might create like this:

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

Fletcher Moore
That's what array_sum() is for.
christian studer
I prefer using "function sum(array $args) {}" as it removes the need to check if you really got an array.
dbemerlin
+3  A: 

what about just passing array?

Andrey
+4  A: 

Take a look at func_get_args( ). It returns an array containing all arguments passed to the function, basically exactly what you want.

You can use func_num_args( ) to directly receive the number of the arguments.

However note that it is, in most cases, better to just pass an array to the function instead. The above functions are thought for special cases where it is easier and/or more readable to not create and pass arrays directly to the function.

This trivial, rather unrealistic, example shows the advantages:

// 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() is clearly easier to use and the calls to it are more readable in this case.

The solution above is general on how to get a function to take an arbitrary amount of arguments. If your problem is really only about adding up some numbers, use array_add() as the other answers pointed out.

lamas
+3  A: 

You can make use of the function func_num_args and func_get_arg as:

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

And call the function as:

echo sum(1);       // prints 1
echo sum(1,2);     // prints 3
echo sum(1,2,3);   // prints 6
codaddict
+5  A: 

just use array_sum():

$sum = array_sum($arrayOfValues);
soulmerge
+1 for OOTB solution.
Crozin
+3  A: 

Yes. We use arrays for that. http://php.net/manual/en/language.types.array.php

And also php has a array_sum function too: http://php.net/manual/en/function.array-sum.php

<?php
$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";
?>
Ahmet Kakıcı
+2  A: 

Yes.

<?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");
Arkh
+4  A: 

Yes, it is

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

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

You can also further abstract this notion to be able to wrap any array function

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

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

or make a currified varargs mapper-wrapper out of it

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

hope this helps!

stereofrog
Very cool answer. `function() use($func) {}` Is this the new lambda stuff in 5.3?
Fletcher Moore
@Fletcher Moore: yes. In 5.2-, something like this could be done with create_function()
stereofrog
A: 

Functional way:

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);
}
Fletcher Moore