¿Alguien tiene una idea de cómo puedo ordenar esta matriz por clave (fecha) en PHP?
Array ( [2011-02-16] => Array ( [date] => 2011-02-16 [num] => 2 ) [2011-02-11] => Array ( [date] => 2011-02-11 [num] => 0 ) [2011-02-17] => Array ( [date] => 2011-02-17 [num] => 0 ) [2011-02-18] => Array ( [date] => 2011-02-18 [num] => 0 ) )
Use la función uasort
, que es una ordenación personalizable por el usuario. Me gusta esto:
function cmp($a, $b) { if ($a['date'] == $b['date']) { return 0; } return ($a['date'] < $b['date']) ? -1 : 1; } uasort($your_array, "cmp");
¿Has probado ksort? http://www.php.net/manual/en/function.ksort.php
Cosa segura. Ayer respondí esta publicación exacta también.
Clasificando 2 matrices para obtener el más alto en uno y el más bajo en otro
En tu caso, será algo así como …
$myArray= subval_sort($myArray,'date'); function subval_sort($a,$subkey) { foreach($a as $k=>$v) { $b[$k] = strtolower($v[$subkey]); } asort($b); foreach($b as $key=>$val){ $c[] = $a[$key]; } return $c; }
EDITAR
La respuesta de shamittomar
es mejor 🙂
Esto debería ayudarlo a repasar los aspectos básicos de la ordenación de arreglos en PHP
http://www.the-art-of-web.com/php/sortarray/
Sin embargo, algo como esto resolvería su problema:
usort($array, "cmp"); function cmp($a, $b){ return strcmp($b['date'], $a['date']);
Bueno, como lo haría la clasificación en la clave, ksort () funcionaría para usted.
Pero si realmente desea ordenar el elemento de fecha, usaría uasort () con una función de ordenación como esta
function compare($a, $b) { if ($a['date']==$b['date']) return 0; return ($a['date']>$b['date'])?1:-1; } uasort($myarray, 'compare');
Dado que su matriz ya tiene la fecha en las teclas, ¿por qué no simplemente usar ksort
? La comparación de cadenas debería funcionar bien ya que está utilizando el formato AAAA-MM-dd.
http://www.php.net/manual/en/function.array-multisort.php
¿El ejemplo # 3 se adaptaría a sus necesidades?
Lo que quieres es UASORT.
http://us3.php.net/manual/en/function.uasort.php
la función sería como:
function cmp($a, $b) { $d1 = strtotime($a['date']); $d2 = strtotime($b['date']); if ($d1 == $d2) { return 0; } return ($d1 < $d2) ? -1 : 1; }
Una mejor respuesta sería usar uksort
que se usa para ordenar claves con una función definida por el usuario (considerando que estas fechas no siempre se pueden comparar y no se pueden ordenar con ksort
sin aplicar primero strtotime
a las teclas):
function sort_by_date_keys($date_key1, $date_key2) { // reverse the order of the $date_keys for "oldest to newest" return strtotime($date_key2) - strtotime($date_key1); ); uksort($array, 'sort_by_date_keys');
Este método está más definido que uasort
ya que se adaptó a las claves.
Ejemplo:
$array = array( '1/1/12' => 'foo1', '1/1/13' => 'foo2' ); uksort($array, 'sort_by_date_keys'); // output $array = array( '1/1/13' => 'foo2', '1/1/12' => 'foo1' );