Сортировка массива объектов в 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

Используйте 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"); 

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

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

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

 $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, чтобы она застряла в конце.

 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() а затем добавить то, что не соответствует в конце.