Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Ordenar Matriz multidimensional por fecha DESC usando array_multisort

Estas en el tema de Ordenar Matriz multidimensional por fecha DESC usando array_multisort en el foro de PHP en Foros del Web. tengo la siguiente estructura en la matriz $matriz[fecha] = array("llave1"=>'valor',"llave2"=>'valor',"llave3" =>'valor') array(3) { ["2014-03-08 16:37:47"]=> array(3) { ["objeto_id"]=> int(698) ["autor_id"]=> int(164) } ["2014-01-18 16:40:37"]=> array(3) ...
  #1 (permalink)  
Antiguo 09/03/2014, 13:36
Avatar de ColdFusion  
Fecha de Ingreso: octubre-2008
Ubicación: Tocoa, Colon Honduras C.A.
Mensajes: 419
Antigüedad: 16 años, 1 mes
Puntos: 9
Ordenar Matriz multidimensional por fecha DESC usando array_multisort

tengo la siguiente estructura en la matriz

$matriz[fecha] = array("llave1"=>'valor',"llave2"=>'valor',"llave3" =>'valor')

array(3) {
["2014-03-08 16:37:47"]=>
array(3) {
["objeto_id"]=>
int(698)
["autor_id"]=>
int(164)
}
["2014-01-18 16:40:37"]=>
array(3) {
["objeto_id"]=>
int(697)
["autor_id"]=>
int(165)
}
["2014-01-05 17:48:27"]=>
array(3) {
["objeto_id"]=>
int(696)
["autor_id"]=>
int(165)
}
}

como veran la llave principal de la matriz es una fecha y por medio de ella quiero ordenar los datos en ella.

actualmente uso
array_multisort($matriz,SORT_DESC);

pero evidentemente no me ordena las fechas descendientemente

Alguna sugerencia?
  #2 (permalink)  
Antiguo 09/03/2014, 14:17
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: Ordenar Matriz multidimensional por fecha DESC usando array_multisort

Personalmente, así, sin mirar nada.... convertiria las fechas en timestamps, y luego ordenaria.

Supongo q habrá más soluciones ^^
__________________
>> Eleazan's Source
>> @Eleazan
  #3 (permalink)  
Antiguo 09/03/2014, 14:59
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Ordenar Matriz multidimensional por fecha DESC usando array_multisort

Código PHP:
Ver original
  1. <?php
  2.     $matriz = array();
  3.     $matriz["2014-03-08 16:37:47"] = array("objeto_id" => 698, "autor_id" => 164);
  4.     $matriz["2014-01-18 16:40:37"] = array("objeto_id" => 697, "autor_id" => 165);
  5.     $matriz["2014-01-05 17:48:27"] = array("objeto_id" => 696, "autor_id" => 165);
  6.    
  7.     $claves_ordenadas = sort(array_keys($matriz));
  8.    
  9.     foreach($claves_ordenadas as $clave)
  10.     {
  11.         // Hacer lo que se quiera con: $matriz[$clave]
  12.         echo($clave.' -> ');
  13.         var_dump($matriz[$clave]); 
  14.     }

Igual, primero verificaria de donde salen esos datos, si salen de una base de datos, le pediria a la base que ordene ella por mi.

NOTA: Esta tecnica funciona por el formato de las fechas, que pueden ser evaluadas como string, si estubiesen las fechas en otro formato, no quedaria otra que hacerlo que como dise Eleazan pasandolas a timestamp, ordenandolas y luego volverlas a fechas asi:

Código PHP:
Ver original
  1. <?php
  2.     $matriz = array();
  3.     $matriz["2014-03-08 16:37:47"] = array("objeto_id" => 698, "autor_id" => 164);
  4.     $matriz["2014-01-18 16:40:37"] = array("objeto_id" => 697, "autor_id" => 165);
  5.     $matriz["2014-01-05 17:48:27"] = array("objeto_id" => 696, "autor_id" => 165);
  6.    
  7.     function callback(&$valor, $clave, $mode){$valor = ($mode == 'toTime' ? strtotime($valor) : date($mode, $valor));}
  8.    
  9.     $claves_ordenadas = array_walk(sort(array_walk(array_keys($matriz), 'callback', 'toTime')), 'callback', 'Y-m-d H:i:s');
  10.    
  11.     foreach($claves_ordenadas as $clave)
  12.     {
  13.         // Hacer lo que se quiera con: $matriz[$clave]
  14.         echo($clave.' -> ');
  15.         var_dump($matriz[$clave]); 
  16.     }
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 09/03/2014, 15:01
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Ordenar Matriz multidimensional por fecha DESC usando array_multisort

Utiliza la función ksort que ordena los elementos de un array por sus índices.

Código PHP:
Ver original
  1. $array = [
  2.             "2014-03-08 16:37:47" => ["fecha", "objeto_id" => "Juan", "autor_id" => 1],
  3.             "2014-03-12 16:37:47" => ["fecha", "objeto_id" => "Luis", "autor_id" => 2],
  4.             "2014-03-10 16:37:47" => ["fecha", "objeto_id" => "María", "autor_id" => 3]
  5.          ];
  6.  
  7. ksort($array);
  8. print_r($array);

Resultado:

Código HTML:
Ver original
  1. Array
  2. (
  3.     [2014-03-08 16:37:47] => Array
  4.         (
  5.             [0] => fecha
  6.             [objeto_id] => Juan
  7.             [autor_id] => 1
  8.         )
  9.  
  10.     [2014-03-10 16:37:47] => Array
  11.         (
  12.             [0] => fecha
  13.             [objeto_id] => María
  14.             [autor_id] => 3
  15.         )
  16.  
  17.     [2014-03-12 16:37:47] => Array
  18.         (
  19.             [0] => fecha
  20.             [objeto_id] => Luis
  21.             [autor_id] => 2
  22.         )
  23.  
  24. )

DEMO

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 09/03/2014, 17:01
Avatar de ColdFusion  
Fecha de Ingreso: octubre-2008
Ubicación: Tocoa, Colon Honduras C.A.
Mensajes: 419
Antigüedad: 16 años, 1 mes
Puntos: 9
Respuesta: Ordenar Matriz multidimensional por fecha DESC usando array_multisort

Los datos de la matriz se obtienen de varias tablas de la base de datos con diferentes datos.

Gracias a todos. pude resolver mi inquietud usando la funcion krsort ya que ksort ordena de menor a mayor.

Saludos!

Etiquetas: desc, fecha, matriz, multidimensional, usando
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:09.