Tisch
Tengo dos arreglos de PHP así:
- Matriz de registros X que contienen la identificación de las publicaciones de WordPress (en un orden particular)
- Matriz de publicaciones de WordPress
Las dos matrices se ven algo como esto:
Matriz uno (matriz personalizada ordenada de ID de publicación de WordPress)
Array (
[0] => 54
[1] => 10
[2] => 4
)
Matriz dos (matriz de publicaciones de WordPress)
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 publicaciones de wordpress con el orden de las ID en la primera matriz.
Espero que esto tenga sentido, y gracias de antemano por cualquier ayuda.
Tomás
editar: el servidor está ejecutando PHP versión 5.2.14
algún día solitario
Esto debería ser bastante fácil de usar 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 funciones y cierres anónimosrequiere PHP 5.3.
Una solución fácil para este pre-5.3 (¡la edad oscura!) 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);
-
Estaba escribiendo exactamente esta misma solución, +1. PD: creo que necesita array_flip $post_ids antes y después de esta función.
– Ricardo Tuín
9 de enero de 2011 a las 22:38
-
@Richard Tuin Esa sería una solución, la otra es usar
array_search
ya que estaba en medio de corregir mi publicación para usar.– algún día solitario
9 de enero de 2011 a las 22:40
-
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 desde aquí, obtengo: Error de análisis: error de sintaxis, T_FUNCTION inesperado —- ¿Siento que debería estar creando una función para hacer la comparación? (disculpe el malentendido también… sin duda estoy teniendo un momento de retraso)… editar: leyendo esto php.net/manual/en/function.usort.php parece hacerlo un poco más claro, ¡pero sigue atascado!
– Tisch
9 de enero de 2011 a las 22:43
-
@Tisch
$posts
es su conjunto de objetos de publicación;$post_ids
es su matriz de valores de ID. Comprenderusort
, probablemente sea más fácil leer la página del manual a la que he vinculado en mi respuesta. Si aún no está seguro, tal vez podría aclarar de qué no está seguro. Esta solución requiere que tengas PHP 5.3. Editaré mi respuesta para reflejar esto.– algún día solitario
9 de enero de 2011 a las 22:46
-
Podría usar array_flip() en lugar de array_search para la solución anterior a 5.3, que sería mucho mejor para ordenar una lista grande
– cabra
9 de enero de 2011 a las 23:03
Puede crear un mecanismo de bucle anidado para hacer coincidir el orden y las identificaciones y reconstruir una nueva matriz de publicaciones.
$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
}
}
}
-
Hacer una copia de ambas matrices (eso es lo que hace foreach) no es necesario aquí.
– Ricardo Tuín
9 de enero de 2011 a las 22:39
-
Gracias por su respuesta. Esto hace el trabajo, sin embargo, ¿parece un poco lento? Acepté la respuesta de todos modos porque hace lo que estoy buscando y funciona con PHP 5.2
– Tisch
9 de enero de 2011 a las 22:53
-
lo siento @jondavidjohn, tuve que cambiar a la solución más rápida. Gracias de nuevo.
– Tisch
9 de enero de 2011 a las 23:13
$sortOrderMap = array_flip($postIds);
usort($posts, function($postA, $postB) use ($sortOrderMap) {
return $sortOrderMap[$postA->ID] - $sortOrderMap[$postB->ID];
});
Simplemente puede restar b de a en lugar de a de b para ordenar la otra dirección
-
gracias por su respuesta también … La solución anterior es muy similar, así que voy a buscar esa si es posible. Aunque parece que PHP 5.2 me está deteniendo 🙁
– Tisch
9 de enero de 2011 a las 22:53