2008-12-10 16 views
14

J'ai deux tableaux en PHP. Le premier tableau ($ author_array) est constitué d'user_ids dans un ordre particulier, comme suit: (8, 1, 6)Tri d'un tableau d'objets dans PHP dans un ordre spécifique

le second réseau (user_results $) est constitué d'un ensemble d'objets comme ceci:

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 
     ) 
) 

Je voudrais "trier" le deuxième tableau de sorte qu'il soit dans cet ordre, ce qui correspond à l'ordre des valeurs dans le premier tableau de (8, 1, 6). Donc, cela ressemblerait à ceci:

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 
     ) 
) 

Je suis faible sur les structures de données. Comment pourrais-je faire ça? :-)

Merci d'avance pour votre aide!

-Bob

Répondre

29

Utilisez usort et fournir une fonction de comparaison personnalisée qui utilise la position de la clé dans votre tableau « de commande » pour déterminer l'ordre de tri, par exemple quelque chose comme:

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

Pourquoi les -1? Il démontre une technique valide que l'OP n'a peut-être pas connue, et elle est différente des autres réponses car elle effectue le tri "en place" plutôt que de faire une copie du tableau original. –

+3

Oui, qui, dans son bon sens, abaisse une solution usort() lorsque le problème concerne la commande personnalisée? : | +1 – gnud

+0

C'est la solution que les développeurs de langage PHP recommandent. – Jacco

3

Je ne suis pas sûr que ce sera beaucoup plus lent que d'autres exemples, mais il semble plus simple. Il se peut que vous ayez pu construire le tableau $ user_results comme un tableau associatif, en utilisant ID comme clé, alors vous pouvez facilement faire des recherches.

$hash = array(); 
$result = array(); 

foreach ($user_results as $obj) { 
    $hash[$obj->ID] = $obj; 
} 

foreach ($author_array as $id) { 
    $result[] = $hash[$id]; 
} 
1

J'ai eu un problème similaire, mais je tente de commander un objet par un tableau (qui n'a pas été un objet). Il est tout simplement pas possible, donc voici ma solution: (propriété)

$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; 
} 

Je suis à la recherche à travers l'objet et l'ajout d'un nouveau appelé « sort_key » que nous utiliserons ensuite pour trier avec usort() et cmp(). Par défaut, la nouvelle sort_key sera 999 et restera bloquée à la fin.

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; 
} 

J'espère que cela est utile - je devais utiliser pour trier un array() par certains keys() puis ajoutez ce qui ne correspond pas à la fin.

Questions connexes