2011-01-09 10 views
7

I tienen dos matrices de PHP así:dos matrices de PHP - Ordenar una matriz con el fin de valor de otra

  1. tabla de registros de X que contiene el ID de de puestos de Wordpress (en un orden particular)
  2. matriz de puestos de Wordpress

Las dos matrices semejante a lo siguiente:

matriz de una (Matriz personalizada Ordenado de Wordpress ID de Mensaje)

Array ( 
    [0] => 54 
    [1] => 10 
    [2] => 4 
) 

matriz de dos (Array Wordpress Mensaje)

Array ( 
    [0] => stdClass Object 
     (
      [ID] => 4 
      [post_author] => 1 
    ) 
    [1] => stdClass Object 
     (
      [ID] => 54 
      [post_author] => 1 
    ) 
    [2] => stdClass Object 
     (
      [ID] => 10 
      [post_author] => 1 
    ) 
) 

me gustaría ordenar la matriz de los puestos de WordPress con el orden de las identificaciones en la primera matriz

Espero que esto tenga sentido, y gracias antes de cualquier ayuda.

Tom

edición: El servidor ejecuta la versión PHP 5.2.14

Respuesta

9

Esto debería ser bastante fácil usando usort, que ordena la matriz mediante una función de comparación definida por el usuario. El resultado podría ser algo como esto:

usort($posts, function($a, $b) use ($post_ids) { 
    return array_search($a->ID, $post_ids) - array_search($b->ID, $post_ids); 
}); 

Tenga en cuenta que esta solución, ya que utiliza anonymous functions and closures, requiere PHP 5.3. (! la edad oscura)


Una solución fácil para este estilo pre-5.3 es hacer esto con un bucle rápido y luego ksort:

$ret = array(); 
$post_ids = array_flip($post_ids); 
foreach ($posts as $post) { 
    $ret[$post_ids[$post->ID]] = $post; 
} 
ksort($ret); 
+0

Estaba escribiendo exactamente esta misma solución, +1. PD: creo que necesitas array_flip $ post_ids antes y después de esta función. –

+0

@Richard Tuin Esa sería una solución, la otra es usar 'array_search', ya que estaba en el medio de corregir mi publicación para usar. – lonesomeday

+0

Esto parece una solución muy elegante, sin embargo, cuando intento implementar esto, ¿me confundo con lo que se supone que debe hacer la función? Si lo copio directamente de aquí obtengo: Error de análisis: error de sintaxis, inesperado T_FUNCTION ---- Siento que debería estar creando una función para hacer la comparación? (disculpe el malentendido también ... sin duda tengo un momento de retraso) ... editar: leer este http://php.net/manual/en/function.usort.php parece hacerlo un poco más claro , pero todavía estancado! – Tisch

2

Se puede crear un mecanismo de bucle anidado para que coincida con el pedido y las identificaciones y reconstruir una nueva matriz de correos.

$new_post_array = array(); 

foreach($id_array as $id) {   //loop through custom ordered ids 

    foreach($post_array as $post) { //for every id loop through posts 

     if($id == $post->ID){   //and when the custom ordered id matches the post->ID 

      new_array[] = $post  //push the post on the new array 

     } 

    } 

} 
+0

Hacer una copia de ambas matrices (eso es lo que hace foreach) no es necesario aquí. –

+0

Gracias por su respuesta. Esto hace el trabajo, sin embargo parece un poco lento? He aceptado la respuesta de todos modos porque hace lo que estoy buscando, y funciona con PHP 5.2 – Tisch

+0

lo siento @jondavidjohn, tuve que cambiar a la solución más rápida. Gracias de nuevo. – Tisch

2
$sortOrderMap = array_flip($postIds); 

usort($posts, function($postA, $postB) use ($sortOrderMap) { 
    return $sortOrderMap[$postA->ID] - $sortOrderMap[$postB->ID]; 
}); 

Simplemente puede restar b de una en lugar de a from b para ordenar la otra dirección

+0

gracias por su respuesta también ... La solución anterior es muy similar, así que voy a seguir esa si es posible. Parece que PHP 5.2 me está deteniendo :( – Tisch

Cuestiones relacionadas