Có thể có một hàm trong PHP mà phải mất 1 hoặc nhiều số và trả về tổng của chúng?Chức năng có thể lấy số đối số không xác định không?
Trả lời
Bạn có thể tận dụng các chức năng func_num_args và func_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
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);
Đó là những gì array_sum() dành cho. –
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
gì về chỉ cần đi qua mảng?
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.
Yes. Chúng tôi sử dụng mảng cho điều đó. http://php.net/manual/en/language.types.array.php
Và cũng php có chức năng array_sum quá: http://php.net/manual/en/function.array-sum.php
<?php
$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";
?>
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");
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!
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? –
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);
}
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
- 1. Làm thế nào để xác định loại scala không có chức năng đối số?
- 2. Chức năng không có đối số được gọi là gì?
- 3. đối số chức năng
- 4. Chức năng không có đối số, với đơn vị làm đối số trong scala
- 5. đối số chức năng động
- 6. Tôi có thể có macro C chấp nhận số tham số không xác định không?
- 7. Chức năng với số tham số không xác định trong C
- 8. F # chức năng có thể thay đổi đối số
- 9. Macro Racket có thể lấy đối số từ khóa không?
- 10. Có thể lấy số tham chiếu đối tượng không?
- 11. Các mẫu biến thể không có tham số chức năng
- 12. Làm đối số chức năng có hỗ trợ giá trị mặc định trong JavaScript không?
- 13. Lặp qua số lượng đối số mảng không xác định
- 14. argparse: Nhận số đối số không xác định
- 15. Chúng ta có thể lấy kiểu đối số lambda không?
- 16. Chức năng PHP - Số lượng đối số tối đa
- 17. Có thể chuyển mẫu chức năng dưới dạng đối số mẫu không?
- 18. Tiêu chuẩn xác thực đối số chức năng/phương pháp
- 19. Cách xác định tệp, chức năng và số dòng?
- 20. Chức năng đối số mặc định và tiêu đề
- 21. Đối số chức năng nhiều loại
- 22. Đối số mẫu mặc định cho mẫu chức năng
- 23. C/C++: Chức năng gọi không có đối số với hàm trả về không có gì
- 24. Chúng tôi có thể gửi một phần vectơ làm đối số chức năng không?
- 25. Chức năng trả về một đối tượng có loại được chỉ định trong đối số
- 26. Chức năng mẫu làm đối số mẫu
- 27. Thông số mẫu chức năng không kiểu
- 28. Chức năng Jquery không được xác định
- 29. chức năng onChange không được xác định
- 30. strptime() chức năng là không xác định
có thể trùng lặp của [Truy cập các đối số không xác định] (http://stackoverflow.com/questions/1151053/accessing-undefined-arguments) – PhoneixS