2010-04-17 12 views
9

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.¿Cómo puedo multiplicar cada elemento en una matriz fácilmente con PHP?

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

+0

me gustaría ir para la solución array_map/bcmul Gordon siempre si no desea utilizar las funciones foreach o personalizados, sin embargo, ¿ha considerado * no * es la multiplicación de la matriz en un 60 y en lugar de dividir el tiempo en un 60 PHP ? –

+0

Voy a probar todos los ejemplos, solo para saber cómo hacerlo en el futuro. El ciclo foreach parece ser el más simple. ¿Cuál es la diferencia entre * = y *? – Henryz

+0

Henryz: $ a * = 6 es la forma abreviada de $ a = $ a * 6 – lamas

Respuesta

7

Sólo iterate sobre la matriz con la declaración foreach y se multiplican:

foreach ($times as $value) { 

    $new_times[] = $value * 60; 

} 
+1

Esto funcionó muy bien para lo que estaba tratando de hacer, gracias. – Henryz

22

Usted puede utilizar array_map:

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

Ejemplos con funciones lambda para devoluciones de llamada:

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

mismo para PHP < 5,3

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

O con bcmul de devolución de llamada

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

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

5

Es posible que desee utilizar foreach la simplicidad en su caso:

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

Asumo que los valores de la matriz son los que usted desea multiplicar, no las teclas. Como la solución anterior usa referencias, también alterará su arreglo original, pero como estaba apuntando a array_map anteriormente, creo que eso lo quiere.

La solución anterior 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 de clasificación avanzados, etc., pero definitivamente no para algo tan trivial como este.

3

yo personalmente segundo la sugerencia de Gordon a un sólo uso lambda (o crear) la función y, o bien 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 ser engorroso si se trata de muchos valores); 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 adelante, en caso de que realmente lo necesite.

De hecho, si vas por referencia y, utilizar foreach nuevo, es posible entrar en resultados inesperados (véase 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); 

de salida es:

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

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

Probablemente no lo que esperas en el segundo ciclo. Es por eso que generalmente evito el foreach & byref combo cuando puedo.

+0

Hola, gracias por la respuesta, esto solo pareció funcionar si construía una nueva matriz como esta v = []. No estoy seguro de por qué: S – Henryz

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

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de tu publicación Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. - [De la reseña] (https://stackoverflow.com/review/low-quality-posts/11668559) – Ferrybig

Cuestiones relacionadas