Сортировка массива объектов в PHP в определенном порядке

У меня есть два массива в PHP. Первый массив ($ author_array) состоит из user_ids в определенном порядке, например: (8, 1, 6)

Второй массив ($ user_results) состоит из массива объектов, таких как:

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

Я хотел бы "отсортировать" второй массив так, чтобы он был в таком порядке, который соответствует порядку значений в первом массиве (8, 1, 6). Так это будет выглядеть так:

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

Я слаб на структурах данных. Как я мог это сделать? :-)

Заранее спасибо за помощь!

-Bob

10.12.2008 09:53:44
4 ОТВЕТА
РЕШЕНИЕ

Используйте usort и предоставьте пользовательскую функцию сравнения, которая использует положение ключа в вашем массиве «ordering» для определения порядка сортировки, например что-то вроде:

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");
29
10.12.2008 11:06:47
Почему -1? Он демонстрирует правильную технику, о которой OP, возможно, не знал, и отличается от других ответов, поскольку выполняет сортировку «на месте», а не делает копию исходного массива.
Paul Dixon 10.12.2008 11:13:24
Да, кто в здравом уме отрицает решение usort (), когда проблема заключается в индивидуальном заказе? : | +1
gnud 10.12.2008 11:16:44
Это решение, которое рекомендуют разработчики языка PHP.
Jacco 10.12.2008 11:28:28
Это работало прекрасно, когда заглянул в мой код. Теперь я постараюсь понять, как, черт возьми, это работает! :-)
bobbyh 11.12.2008 02:47:31

Я не уверен, будет ли это значительно медленнее, чем другие примеры, но это кажется проще. Может случиться так, что вы можете построить массив $ user_results как ассоциативный для начала, используя ID в качестве ключа, тогда вы можете легко выполнять поиск.

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

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

foreach ($author_array as $id) {
    $result[] = $hash[$id];
}
3
10.12.2008 10:11:57

У меня была похожая проблема, но я пытался упорядочить объект по массиву (это не был объект). Это просто невозможно, поэтому вот мой обходной путь:

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

Я просматриваю объект и добавляю новое (свойство?) С именем "sort_key", которое мы затем будем использовать для сортировки с помощью usort () и cmp (). По умолчанию новый sort_key будет 999, поэтому он застрянет в конце.

1
26.02.2011 22:09:27
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;
}

Я надеюсь, что это полезно - мне пришлось использовать это для сортировки array()по некоторым, keys()а затем добавить то, что не соответствует в конце.

0
27.10.2012 18:25:53