¿Cómo puedo multiplicar cada elemento en una matriz fácilmente con PHP?

Tengo una matriz llamada $times . Es una lista de números pequeños ( 15,14,11,9,3,2 ). Estos serán enviados por el usuario y se supone que son minutos. Como el tiempo de PHP funciona en segundos, me gustaría multiplicar cada elemento de mi matriz por 60.

He estado jugando con array_walk y array_map pero no puedo hacer que funcionen.

Simplemente itere sobre la matriz con la instrucción foreach y multiplique:

 foreach ($times as $value) { $new_times[] = $value * 60; } 

Puedes usar array_map :

array_map () devuelve una matriz que contiene todos los elementos de arr1 después de aplicar la función de callback a cada uno. El número de parámetros que acepta la función de callback debe coincidir con el número de matrices que se pasaron a array_map ()

Ejemplos con funciones lambda para devoluciones de llamada:

 array_map(function($el) { return $el * 60; }, $input); 

Lo mismo para PHP <5.3

 array_map(create_function('$el', 'return $el * 60;'), $input); 

O con bcmul para callback

 array_map('bcmul', $input, array_fill(0, count($input), 60)); 

Pero no hay nada de malo con solo usar foreach para esto también.

Es posible que desee utilizar Foreach para simplificar en su caso:

 foreach( $times as &$val ){ $val *= 60; } 

Supongo que los valores de su matriz son los que quiere multiplicar, no las claves. Como la solución anterior usa referencias, también alterará tu matriz original, pero como antes apuntabas a array_map , creo que quieres eso.

La solución de arriba es probablemente más fácil de entender y muy probablemente más rápida que usar array_map que (obviamente) tiene que llamar a una función para cada elemento. Utilizaría array_map solo para cosas más complicadas, como algoritmos avanzados de clasificación, etc., pero definitivamente no para algo tan trivial como este.

Yo personalmente secundé la sugerencia de Gordon de simplemente usar una función lambda (o creada) y hacer:

 array_map(function($el) { return $el * 60; }, $input_array); 

(PHP> = 5.3) o

 array_map(create_function('$el', 'return $el * 60;'), $input_array); 

(PHP <5.3)

Definitivamente no veo razones para duplicar la matriz (puede volverse engorroso si hay muchos valores involucrados); también, preste atención que usar foreach (que en segundo lugar puede ser útil) también puede ser peligroso si no está trabajando con cuidado … y el mantenimiento puede ser desalentador de todos modos (porque debe recordar tratar con él siempre trabajas en ese código). Si no tiene motivos para optimizar en esta etapa (IE su aplicación no tiene problemas de velocidad), no lo haga ahora y no se preocupe por utilizar array_map. Ahora puede pensar en la facilidad de mantenimiento y optimizarlo más tarde, en caso de que realmente lo necesite.

De hecho, si va por referencia y luego usa foreach nuevamente, puede obtener resultados inesperados (vea el ejemplo a continuación …)

 $a=array('1','2','3'); foreach ($a as &$v) { $v *= 60; } print_r($a); foreach ($a as $v); print_r($a); 

La salida es:

Matriz ([0] => 60 [1] => 120 [2] => 180)

Matriz ([0] => 60 [1] => 120 [2] => 120)

Probablemente no sea lo que espera en el segundo ciclo. Esta es la razón por la que generalmente evito el combo foreach & byref cuando puedo.

 array_walk($myArray, function(&$v) {$v *= 60;});