2012-01-03 20 views
8

--- puntos array $ ----preguntas sobre matriz ordenado por horas en php

Array 
    (
     [0] => Array 
      (
       [0] => 2011-10-02 05:30:00 
       [1] => 20 
      ) 

     [1] => Array 
      (
       [0] => 2011-10-04 09:30:00 
       [1] => 12 
      ) 

     [2] => Array 
      (
       [0] => 2011-10-01 13:30:00 
       [1] => 25 
      ) 

     [3] => Array 
      (
       [0] => 2011-10-03 02:30:00 
       [1] => 31 
      ) 

    ) 

que tienen una serie de arriba y les gustaría para ordenar esta matriz por el tiempo. Luego usé el código como siguiente para ordenar y el resultado es correcto. Sin embargo, si cambié el código time[$key] = $val[0] a $time = $val[0], el resultado es incorrecto.

¿Hay alguien que pueda explicarme esto? ¡Muchas gracias!

foreach($points as $key=>$val){ 

     $time[$key] = $val[0]; 

     array_multisort($time, SORT_ASC, $points); 
    } 
+0

Haga esta prueba: Retire la última línea ('' array_mu ...), como comentario o algo, y luego imprimir '$ tiempo' después de la' bucle foreach' usando la instrucción 'time [$ key] = $ val [0]'. Luego, cambie la línea a '$ time = $ val [0]' y vea qué '$ time' produce después del ciclo. – ladaghini

+0

Esto se debe a la forma en que funciona 'array_multisort'. Clasifica varias matrices, y cuando la matriz '$ time' está ordenada, la matriz' $ points' se reorganiza de acuerdo con los índices de la matriz en '$ time'. Sin embargo, el 'array_multisort' debería venir después del' foreach'. – cmbuckley

Respuesta

7

array_multisort tipo más de una matriz a la vez. Sin embargo, funciona en una matriz de columnas, por lo que se necesita el ciclo foreach para obtener una columna de los tiempos. Después de compilar esta lista, puede realizar el multisorto. La matriz $points se ordena de acuerdo con los índices en $times, según this example in the docs.

Sin embargo, no necesita realizar el orden dentro del foreach, ya que eso significa que el orden ocurre 4 veces (en su ejemplo). Sólo tiene que ocurrir una vez:

foreach ($points as $key => $val) { 
    $time[$key] = $val[0]; 
} 

array_multisort($time, SORT_ASC, $points); 
-2

Lo que se quiere hacer es (idea básica):

foreach($points as $key=>$val){ 
    $time[$val[1]] = $val[0]; // $time will be an array of [ point => time ] pairs 
} 
asort($time); // sorts the array and maintains indexes 

Después de esto usted tiene una serie de pares de point => time, clasificados por hora. Para obtener sólo los puntos, por ejemplo, hacer

$points = array_keys($time); 
+0

No es necesario hacer 'ksort()' dentro de su ciclo, eso solo agrega una sobrecarga adicional innecesaria. Además, estás cambiando por completo la estructura de la matriz. – kba

+0

Sin embargo, tenías razón sobre lo del loop. – Rijk

3

La función ausort() tiene una función de comparación de devolución de llamada. Puede usar esto para comparar dos marcas de tiempo.

$arr = array(
     array('2011-10-02 05:30:00','20'), 
     array('2011-10-04 09:30:00','12'), 
     array('2011-10-01 13:30:00','25'), 
     array('2011-10-03 02:30:00','31') 
); 

function timecomp($a,$b) 
{ 
    // Subtracting the UNIX timestamps from each other. 
    // Returns a negative number if $b is a date before $a, 
    // otherwise positive. 
    return strtotime($b[0])-strtotime($a[0]); 
} 
uasort($arr,'timecomp'); 

print_r($arr); 

El código anterior devolverá

(
    [1] => Array 
     (
      [0] => 2011-10-04 09:30:00 
      [1] => 12 
     ) 

    [3] => Array 
     (
      [0] => 2011-10-03 02:30:00 
      [1] => 31 
     ) 

    [0] => Array 
     (
      [0] => 2011-10-02 05:30:00 
      [1] => 20 
     ) 

    [2] => Array 
     (
      [0] => 2011-10-01 13:30:00 
      [1] => 25 
     ) 

) 
+1

¿Y cómo este script NO agrega una sobrecarga innecesaria? : P Las cadenas de tiempo ya se pueden ordenar, todo lo que haces al recorrer la matriz y convertirlas en marcas de tiempo es ridículo. Además, ¿acabas de inventar una nueva estructura '$ arr' o algo así? No lo encontré en la publicación original. Gracias por el voto negativo. – Rijk

+0

@Rijk Este sitio es para ayudar, no para atacar. Me dieron críticas constructivas sobre tu código. Si hay una sobrecarga, por favor dígame exactamente dónde se puede mejorar. Y no, no estoy creando una nueva estructura '$ arr'. – kba

+0

O entendí mal la pregunta, o ya te lo dije. Está en mi respuesta también. – Rijk