Classificação de uma matriz de objetos em PHP em uma ordem específica

votos
14

Eu tenho duas matrizes em PHP. A primeira matriz ($ author_array) é composto de user_ids numa determinada ordem, como: (8, 1, 6)

A segunda matriz ($ user_results) é composto de uma série de objectos, como por isso:

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

Eu gostaria de tipo a segunda matriz por isso é nesta ordem, o que coincide com a ordem dos valores na primeira matriz de (8, 1, 6). Então, ele ficaria assim:

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

Eu sou fraco em estruturas de dados. Como eu poderia fazer isso? :-)

Agradeço antecipadamente por sua ajuda!

-Prumo

Publicado 10/12/2008 em 10:53
fonte usuário
Em outras línguas...                            


4 respostas

votos
29

Use usort e fornecer uma função de comparação personalizada que utiliza a posição da chave em sua matriz "ordenação" para determinar a ordem de classificação, por exemplo, 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");
Respondeu 10/12/2008 em 11:06
fonte usuário

votos
3

Eu não tenho certeza se isso vai ser significativamente mais lento do que outros exemplos, mas parece mais simples. Pode ser que você poderia construir o array $ user_results como um associativo para começar, usando ID como a chave, então você pode facilmente fazer pesquisas.

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

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

foreach ($author_array as $id) {
    $result[] = $hash[$id];
}
Respondeu 10/12/2008 em 11:11
fonte usuário

votos
1

Então eu tive um problema semelhante, mas eu estava tentando encomendar um objeto por um array (que não era um objeto). É simplesmente não é possível, então aqui está a minha solução:

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

Eu estou olhando através do objeto e adicionando uma nova (propriedade?) Chamado "sort_key", que vamos usar para classificar com usort () e CMP (). Por padrão, o novo sort_key será 999 para que ele fica preso no final.

Respondeu 26/02/2011 em 23:09
fonte usuário

votos
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 este seja útil - Eu tive que usar isso para classificar uma array()por alguns keys()e, em seguida, acrescentar o que não corresponde ao final.

Respondeu 20/04/2012 em 23:15
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more