organizar - ordenar json php
Ordenando una matriz de objetos en PHP en un orden especĂfico (4)
Tengo dos arreglos en PHP. La primera matriz ($ author_array) se compone de user_ids en un orden particular, como sigue: (8, 1, 6)
La segunda matriz ($ user_results) se compone de una matriz de objetos como esta:
Array
(
[0] => stdClass Object
(
[ID] => 1
[user_login] => user1
)
[1] => stdClass Object
(
[ID] => 6
[user_login] => user6
)
[2] => stdClass Object
(
[ID] => 8
[user_login] => user8
)
)
Me gustaría "ordenar" la segunda matriz por lo que está en este orden, que coincide con el orden de los valores en la primera matriz de (8, 1, 6). Entonces se vería así:
Array
(
[0] => stdClass Object
(
[ID] => 8
[user_login] => user8
)
[1] => stdClass Object
(
[ID] => 1
[user_login] => user1
)
[2] => stdClass Object
(
[ID] => 6
[user_login] => user6
)
)
Soy débil en las estructuras de datos. ¿Cómo podría hacer esto? :-)
¡Gracias de antemano por tu ayuda!
-Chelín
No estoy seguro de si esto será significativamente más lento que otros ejemplos, pero parece más simple. Puede ser que usted pueda construir la matriz $ user_results como una asociativa para comenzar, usando ID como la clave, luego puede hacer búsquedas fácilmente.
$hash = array();
$result = array();
foreach ($user_results as $obj) {
$hash[$obj->ID] = $obj;
}
foreach ($author_array as $id) {
$result[] = $hash[$id];
}
Use usort y proporcione una función de comparación personalizada que utilice la posición de la clave en su matriz "ordenando" para determinar el orden de clasificación, por ejemplo, algo como:
function cmp($a, $b)
{
global $author_array;
$pos1=array_search ($a->ID, $author_array);
$pos2=array_search ($b->ID, $author_array);
if ($pos1==$pos2)
return 0;
else
return ($pos1 < $pos2 ? -1 : 1);
}
usort($user_results, "cmp");
Así que tuve un problema similar, pero estaba tratando de ordenar un objeto por una matriz (que no era un objeto). Simplemente no es posible, así que aquí está mi solución:
$sort_array= array(11, 4, 16, 19, 23);
$myobject = sort_categories($myobject)
function cmp($a, $b) {
if ($a->sort_key == $b->sort_key) { return 0; }
return ($a->sort_key < $b->sort_key) ? -1 : 1;
}
function sort_categories($obj) {
global $sort_array;
foreach($obj as $cat) {
$cat->sort_key = 999;
for ($i=0;$i<count($sort_array);$i++) {
if ($sort_array[$i] == $cat->term_id) $cat->sort_key = $i;
}
}
usort($obj,''cmp'');
return $obj;
}
Estoy mirando el objeto y agregando una nueva (propiedad?) Llamada "sort_key" que luego usaremos para ordenar con usort () y cmp (). Por defecto, la nueva sort_key será 999, por lo que se queda bloqueada al final.
public static function reorganizeBykey ($objects, array $keys){
$results = array();
foreach($keys as $key){
$i=0;
foreach($objects as $object){
if($object->sourceName==$key){
$results[$i] = $object;
}
$i++;
}
}
$others = (array_diff_assoc($objects,$results));
$results = array_merge($results,$others);
return $results;
}
Espero que esto sea útil: tuve que usar esto para ordenar una array()
con algunas keys()
y luego anexar lo que no coincide al final.