2010-08-13 27 views
8

tengo una matrizAñadir a un valor de matriz (1)

$hourly = array(
     "01" => "0", 
     "02" => "0", 
     "03" => "0", 
     "04" => "0", 
     "05" => "0", 
     "06" => "0", 
     "07" => "0", 
     "08" => "0", 
     "09" => "0", 
     "10" => "0", 
     "11" => "0", 
     "12" => "0", 
     "13" => "0", 
     "14" => "0", 
     "15" => "0", 
     "16" => "0", 
     "17" => "0", 
     "18" => "0", 
     "19" => "0", 
     "20" => "0", 
     "21" => "0", 
     "22" => "0", 
     "23" => "0" 
      ); 

y tengo un montón de datos como "01" y "03" y "21" y quiero añadir (1) a ese valor específico en la matriz. Así que con el conjunto de datos "01", "03", "21", "01", "22", la matriz resultante sería

$hourly = array(
     "01" => "2", 
     "02" => "0", 
     "03" => "1", 
     "04" => "0", 
     "05" => "0", 
     "06" => "0", 
     "07" => "0", 
     "08" => "0", 
     "09" => "0", 
     "10" => "0", 
     "11" => "0", 
     "12" => "0", 
     "13" => "0", 
     "14" => "0", 
     "15" => "0", 
     "16" => "0", 
     "17" => "0", 
     "18" => "0", 
     "19" => "0", 
     "20" => "0", 
     "21" => "1", 
     "22" => "1", 
     "23" => "0" 
      ); 

¿Cómo podría ir haciendo eso? ¿Hay una función para agregar 1 a un elemento de la matriz?

+1

¿Qué estás tratando de lograr? Los datos de muestra/explicación no se sincronizan del todo. –

+0

Quiere aumentar en 1 los valores que aparecen en la otra matriz. –

+1

Si desea realizar operaciones matemáticas en ellos, ¿por qué sus cadenas de valores de matriz no son enteros? –

Respuesta

13
$hours = array("01", "03", "21"); 
foreach($hours as $hour) { 
    $hourly[$hour] += 1; 
} 
0

Si simplemente desea incrementar cada elemento de la matriz, se puede utilizar:

<?php 

    foreach($hourly as &$element) { 
     $element++; 
    } 

?> 

Sin embargo, si sólo desea incrementar los elementos que mantienen un valor, puede utilizar:

<?php 

    foreach($hourly as &$element) { 
     $element = $element ? $element + 1 : $element; 
    } 

?> 
+0

Quiero tomar los valores dados e incrementarlos solo ("01", "03", "21", "01", "22") por ejemplo. Y me preguntaba si hay alguna forma de evitar tener que recorrer toda la matriz para cada valor y agregar +1 a ese valor específico, ya que la lista de datos puede ser extremadamente larga. – Steven

+0

No, no hay forma de hacerlo sin iterar. (Dicho esto, por supuesto, puede agregar el valor usando un getter y dejar la matriz intacta.) ¿Para qué sirve este código? (Supongo que en algún momento basado en el tiempo?) –

19
$updates = array("01","03","21","01","22"); 
foreach($updates as $num) { 
    $hourly[$num]++; 
} 
6

Normalmente, usted sería capaz de hacer:

$array["key"]++; 

Sin embargo, sus matrices tienen algunas peculiaridades que debe corregir;

  • Sus valores clave son en realidad cadenas. Si desea números, puede aumentar, debe usar números desde el principio. Si almacena una cadena y la incrementa con la sintaxis anterior, se convertirá en un número entero.
  • Las matrices almacenan cadena o un número como clave. Estás usando ambos. "01" se almacenará como una clave de cadena, "10" se almacenará como un número. Considere almacenar solo números como llaves.

Ninguno de estos hace que su script no funcione, pero la inconsistencia y el rendimiento innecesario son evitables.

0

Se podría construir una matriz con la información actualizada ($new = array('01' => '02','03' => '01',) etc y luego usar array_replace($hourly,$new) o array_merge($hourly,$new). Hay funciones probablemente alternativas también.

1

Se puede utilizar un enfoque totalmente "funcional", incluso si es PHP Identificación e incluso no es muy bonito ;-) pero funciona (PHP> = 5.3.0):

... 

$fr = 1; $to = 23; 

# generate original Array 
$hourly = array_combine(
    array_map(function($n){return sprintf("%02s",$n);}, range($fr,$to)), # Keys 
    array_map(function($n){return 0;}, range($fr,$to))     # Values 
); 

$updates = Array('01','03','21','01','22'); 

# update values based on keys found in $updates 
array_walk($updates, function($u){global $hourly; $hourly[$u]++;}); 

... 

Saludos

rbo

+1

Totalmente demasiado complejo para lo que OP pidió – Dave

Cuestiones relacionadas