2011-05-06 23 views
5

Creo que podría haber leído todos los artículos de usort en StackOverflow, pero no puedo encontrar este. Es posible que usort no sea la herramienta que necesito? Aquí hay un poco de la matriz que estoy trabajando con (lo tengo asignado a $allPages):¿Cómo debo ordenar esta matriz por clave con el usort?

Array 
(
    [0] => Page Object 
     (
      [id] => 4 
      [slug] => articles 
      [created_on] => 2009-08-06 07:16:00 
     ) 

    [1] => Page Object 
     (
      [id] => 99 
      [slug] => a-brief-history 
      [created_on] => 2011-04-25 12:07:26 
     ) 

    [2] => Page Object 
     (
      [id] => 98 
      [slug] => we-arrive 
      [created_on] => 2011-04-24 13:52:35 
     ) 

    [3] => Page Object 
     (
      [id] => 83 
      [slug] => new-year 
      [created_on] => 2011-01-02 14:05:12 
     ) 
) 

que estoy tratando en última instancia, para ordenar en el valor created_on, pero por el momento, me conformaría en ser capaz de ordenar en cualquiera de ellos! Cuando intento el tipo normal de devolución de llamada cmp($a, $b) con usort - como, por ejemplo, en this answer on a usort question - Me sale un espacio en blanco. Ejemplo:

function cmp($a, $b) { 
    return strcmp($a["slug"], $b["slug"]); 
} 
usort($allPages, 'cmp') 

Y print_r no me da nada. Esto es con PHP 5.2.n, no 5.3 por cierto.

Orientación, por favor? ¡Y gracias!

+0

¿A qué te refieres con el valor de created_on? – SIFE

Respuesta

4

Sus elementos de la matriz son objetos, no arrays asociativos, por lo que necesita para hacer referencia a ellos de esta manera:

function cmp($a, $b) { 
    return strcmp($a->slug, $b->slug); 
} 
usort($allPages, 'cmp') 
+0

PHP usa flechas, no puntos. Pero la idea es la misma. – Tesserex

+0

Jaja, lo siento, trabajo con PHP y Ruby a diario y a veces los mezclo cuando cambio tan rápido. Fijo. – Kelly

+0

que lo rompió! Una especie de "doh!" momento para mi ¡Muchas gracias! –

3

el volcado de la matriz dice que los elementos son objetos de página, no las matrices. Por casualidad, ¿necesita decir $a->created_on en lugar de $a['created_on']? Usar notación de objetos en lugar de notación de matriz.

sólo una suposición ...

+0

Sí, y gracias por empujar el código de Kelly. Fue arreglado para cuando pude volver a esto. :) –

1

Como sugiere @Tesserex, es necesario utilizar notación de objetos en lugar de la notación de matriz.

Si tenía los avisos encendidos, recibiría mensajes de error sobre el acceso a un objeto como una matriz.

Otra cosa a tener en cuenta, es que sus páginas no tienen todos un atributo 'created_on', algunas tienen un atributo 'published_on'. Tendrá que hacer algunas comprobaciones de errores/lógica dentro de su método de protección para asegurarse de que la clave que desea ordenar está disponible, y hacer algo cuando no sea así.

+0

Gracias por el aviso en los mensajes de error. En el entorno para el que está diseñado este código, es un dolor activar el informe de errores, pero debería haberme tomado la molestia. Y bien atrapado en los diferentes atributos de fecha: de hecho, todos tienen ambos. Ese fue solo mi error al recortar los objetos para presentarlos aquí. –

+0

'error_reporting (E_ALL);' y 'ini_set ('display_errors', 'on');' deberían funcionar en la mayoría de las situaciones. métodos no muy conocidos \: –

Cuestiones relacionadas