¿Es posible tener una función en PHP que tome 1 o más números y devuelve su suma?¿Puede una función tomar un número indefinido de argumentos?
Respuesta
se puede hacer uso de la función func_num_args y func_get_arg como:
function sum() {
for($i=0,$sum=0;$i<func_num_args();$i++) {
$sum += func_get_arg($i);
}
return $sum;
}
Y llama a la función como:
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
es una matriz, que puede crear de esta manera:
$args = array(3, 4, 5, 6);
Para eso es para array_sum(). –
Prefiero usar "función suma (matriz $ args) {}" ya que elimina la necesidad de verificar si realmente tienes una matriz. – dbemerlin
qué pasa simplemente de paso matriz?
Eche un vistazo a func_get_args(). Devuelve una matriz que contiene todos los argumentos pasados a la función, básicamente exactamente lo que quiere.
Puede usar func_num_args() para recibir directamente el número de argumentos.
Sin embargo, tenga en cuenta que, en la mayoría de los casos, es mejor pasar una matriz a la función. Las funciones anteriores están pensadas para casos especiales donde es más fácil y/o más legible no crear y pasar matrices directamente a la función.
Este trivial, poco realista, ejemplo muestra las ventajas:
// 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()
es claramente más fácil de usar y las llamadas a que son más legibles en este caso.
La solución anterior es general sobre cómo hacer que una función tome una cantidad arbitraria de argumentos. Si su problema es realmente solo sumar algunos números, use array_add()
como se indicó en las otras respuestas.
sólo tiene que utilizar array_sum():
$sum = array_sum($arrayOfValues);
+1 para la solución OOTB. – Crozin
Sí. Usamos matrices para eso. http://php.net/manual/en/language.types.array.php
Y también tiene una función php array_sum también: http://php.net/manual/en/function.array-sum.php
<?php
$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";
?>
Sí.
<?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");
sí, es
function sum() {
$args = func_get_args();
return array_sum($args);
}
echo sum(1, 2, 3, 4);
Puede también más abstracta esta noción de ser capaz de envolver cualquier función de matriz
function mapargs() {
$args = func_get_args();
return call_user_func(array_shift($args), $args);
}
echo mapargs('array_sum', 1, 2, 3, 4);
o hacer una currified varargs asignador de envoltura de es
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);
¡espero que esto ayude!
Muy buena respuesta. 'function() use ($ func) {}' ¿Es este el nuevo material lambda en 5.3? –
manera funcional:
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);
}
En PHP 5.6 y más tarde usted será capaz de hacerlo de esta manera:
function sum(...$nums) {
for($i=0,$sum=0;$i<count($nums);$i++) {
$sum += $nums[$i];
}
return $sum;
}
O simplificada usando foreach:
function sum(...$nums) {
$sum=0;
foreach($nums as $num) {
$sum += $num;
}
return $sum;
}
Fuente : PHP Manual: Function arguments
- 1. ¿Puede un sass @mixin aceptar un número indefinido de argumentos?
- 2. ¿Puede una sentencia switch tomar dos argumentos?
- 3. Función con número variable de argumentos
- 4. C++ Punteros de función con un número desconocido de argumentos
- 5. Pasando número variable de argumentos de una función a otra
- 6. Obtener el número de argumentos para una función de clase
- 7. Pasando Variable Número de argumentos
- 8. Argumentos ilimitados en una función de JavaScript
- 9. Número indefinido de argumentos para las funciones definidas por el usuario de SQL?
- 10. Cómo dejar Pool.map tomar una función lambda
- 11. punteros de función y número indeterminado de argumentos en C++
- 12. Función en C con argumentos ilimitados?
- 13. variable pasante número de argumentos
- 14. sha256 función Indefinido()
- 15. UITapGestureRecognizer initWithTarget: action: ¿método para tomar argumentos?
- 16. Condicionalmente se pasa un número arbitrario de argumentos con nombre predeterminado a una función
- 17. ¿Número incorrecto de argumentos?
- 18. cómo tomar enteros como argumentos de línea de comando?
- 19. Funciones de PHP: número máximo de argumentos
- 20. Lee un número indefinido de líneas desde la entrada estándar
- 21. Una función con número variable de argumentos con tipos conocidos, el camino de C++ 11
- 22. ¿Es legal tomar la dirección de un parámetro de función?
- 23. ¿C++ 11 std :: function limita el número de argumentos que puede tener un puntero a la función?
- 24. Jquery - Tomar variable de otra función
- 25. ¿Pueden las macros Racket tomar argumentos de palabra clave?
- 26. Operación en ... ¿puede estar indefinido?
- 27. Pasando todos los argumentos de una función a otra función
- 28. ¿Se puede convertir un puntero a una función de un tipo en una función de otro tipo que toma argumentos adicionales?
- 29. argumentos de la función
- 30. ¿Puede Gnuplot tomar argumentos diferentes en tiempo de ejecución? tal vez con Python?
posible duplicado de [Acceso a argumentos no definidos] (http://stackoverflow.com/questions/1151053/accessing-undefined-arguments) – PhoneixS