Может функциональное взятие неопределенное количество аргументов?

Действительно ли возможно иметь функцию в PHP, который берет 1 или более чисел и возвращает их сумму?

12
задан alex 9 September 2010 в 13:53
поделиться

9 ответов

Вы можете использовать функции 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
18
ответ дан 2 December 2019 в 03:25
поделиться

Посмотрите на 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(), как было указано в других ответах.

5
ответ дан 2 December 2019 в 03:25
поделиться

просто используйте array_sum():

$sum = array_sum($arrayOfValues);
4
ответ дан 2 December 2019 в 03:25
поделиться

Да. Для этого мы используем массивы. http://php.net/manual/en/language.types.array.php

А также в php есть функция array_sum: http://php.net/manual/en/function.array-sum.php

<?php
$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";
?>
3
ответ дан 2 December 2019 в 03:25
поделиться

как насчет простой передачи массива?

3
ответ дан 2 December 2019 в 03:25
поделиться

Да.

<?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");
2
ответ дан 2 December 2019 в 03:25
поделиться

Да, это

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

или сделать из нее карризованный преобразователь-обертку varargs

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

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

6
ответ дан 2 December 2019 в 03:25
поделиться
function sum($args) {
  $total = 0;
  foreach($args as $num) {
    $total += $num;
  }
  return $total;
}

$ args - это массив, который можно создать следующим образом:

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

0
ответ дан 2 December 2019 в 03:25
поделиться

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

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);
}
0
ответ дан 2 December 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: