2010-05-03 36 views

Trả lời

18

Bạn có thể tận dụng các chức năng func_num_argsfunc_get_arg như:

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

Và gọi hàm như:

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 là một mảng, mà bạn có thể tạo ra như thế này:

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

+0

Đó là những gì array_sum() dành cho. –

+0

Tôi thích sử dụng "hàm sum (mảng $ args) {}" vì nó loại bỏ sự cần thiết phải kiểm tra xem bạn có thực sự có một mảng hay không. – dbemerlin

3

gì về chỉ cần đi qua mảng?

5

Hãy xem func_get_args(). Nó trả về một mảng chứa tất cả đối số được truyền cho hàm, về cơ bản chính xác những gì bạn muốn.

Bạn có thể sử dụng func_num_args() để trực tiếp nhận số lượng đối số.

Tuy nhiên, lưu ý rằng, trong hầu hết các trường hợp, tốt hơn là chỉ chuyển một mảng vào hàm thay thế. Các hàm trên được cho là dành cho các trường hợp đặc biệt, nơi nó dễ đọc và/hoặc dễ đọc hơn để không tạo và truyền các mảng trực tiếp đến hàm.

này tầm thường, chứ không phải thực tế, ví dụ cho thấy những ưu điểm:

// 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() rõ ràng là dễ dàng hơn để sử dụng và các cuộc gọi đến nó là dễ đọc hơn trong trường hợp này.

Giải pháp trên nói chung về cách lấy hàm để lấy số lượng đối số tùy ý. Nếu sự cố của bạn thực sự chỉ là về việc thêm một số số, hãy sử dụng array_add() làm các câu trả lời khác được chỉ ra.

2

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

Vâng, đó là

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

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

Bạn cũng có thể thêm trừu tượng khái niệm này để có thể quấn bất kỳ chức năng mảng

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

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

hoặc thực hiện một currified varargs mapper-wrapper ra khỏi 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); 

hi vọng điêu nay co ich!

+1

Câu trả lời rất hay. 'function() use ($ func) {}' Đây có phải là công cụ lambda mới trong 5.3 không? –

0

cách chức năng:

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

Trong PHP 5.6 và sau đó bạn sẽ có thể làm theo cách này:

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

Hoặc, đơn giản hóa sử dụng foreach:

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

Nguồn : PHP Manual: Function arguments

Các vấn đề liên quan