2008-12-10 15 views
14

Tengo dos matrices en PHP. La primera matriz ($ author_array) se compone de user_ids en un orden particular, así: (8, 1, 6)Ordenar una matriz de objetos en PHP En un orden específico

la segunda matriz ($ user_results) está compuesto de una matriz de objetos de este modo:

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 es 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 su ayuda!

-Bob

Respuesta

29

Uso usort y proporcionar una función de comparación personalizada que utiliza la posición de la llave en la matriz de "ordenamiento" para determinar el orden de clasificación, por ejemplo, algo así 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"); 
+0

¿Por qué el -1? Demuestra una técnica válida que el OP podría no haber tenido en cuenta, y es diferente a las otras respuestas, ya que realiza el tipo "en su lugar" en lugar de hacer una copia de la matriz original. –

+3

Sí, ¿quién en su sano juicio desestima una solución de usort() cuando el problema es un pedido personalizado? : | +1 – gnud

+0

Esta es la solución que recomiendan los desarrolladores de lenguaje PHP. – Jacco

3

No estoy seguro de si esto será significativamente más lento que otros ejemplos, pero parece más sencillo. 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]; 
} 
1

así que tuve un problema similar, pero yo estaba tratando de ordenar un objeto mediante una matriz (que no era un objeto). Es que no es posible, así que aquí está mi solución: (? Propiedad)

$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 a través del objeto y la adición de una nueva llamada "sort_key", que vamos a continuación, utilizar para ordenar con usort() y cmp(). Por defecto, la nueva sort_key será 999, por lo que se queda bloqueada al final.

0
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 - que tenía que usar esto para ordenar un array() por algunos keys() y luego añadir lo que no coincide al final.

Cuestiones relacionadas