2010-05-03 9 views

Odpowiedz

18

Można skorzystać z funkcji func_num_args i func_get_arg jak:

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

i wywołać funkcję jak:

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 jest tablicą, która może stworzyć tak:

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

+0

Do tego służy funkcja array_sum(). –

+0

Wolę używać "function sum (array $ args) {}", ponieważ eliminuje to konieczność sprawdzenia, czy naprawdę masz tablicę. – dbemerlin

5

Proszę spojrzeć na func_get_args(). Zwraca tablicę zawierającą wszystkie argumenty przekazane do funkcji, w zasadzie dokładnie to, co chcesz.

Możesz użyć func_num_args(), aby bezpośrednio otrzymać liczbę argumentów.

Należy jednak pamiętać, że w większości przypadków lepiej jest po prostu przekazać tablicę do funkcji. Powyższe funkcje są uważane za specjalne przypadki, w których łatwiej i/lub bardziej czytelnie nie można tworzyć i przekazywać tablic bezpośrednio do funkcji.

to trywialne, raczej nierealne, przykład pokazuje zalety:

// 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() wyraźnie łatwiejszy w obsłudze i rozmowy do niej bardziej czytelna w tym przypadku.

Powyższe rozwiązanie jest ogólnym sposobem uzyskania dowolnej liczby argumentów. Jeśli twój problem polega tylko na dodaniu liczb, użyj array_add(), jak wskazano w innych odpowiedziach.

2

Tak.

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

Tak, to jest

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

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

Można również dodatkowo abstrakcyjne pojęcie móc owinąć każdą funkcję tablicową

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

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

lub dokonać currified varargs odwzorowujący-wrapper z to

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

mam nadzieję że to pomoże!

+1

Bardzo fajna odpowiedź. 'function() use ($ func) {}' Czy to nowa właściwość lambda w wersji 5.3? –

0

sposób funkcjonalny:

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

W PHP 5.6, a później będzie można to zrobić w ten sposób:

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

Albo uprościć używając foreach:

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

Źródło : PHP Manual: Function arguments

Powiązane problemy