Сортировка массива объектов в 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
Ответы
Ответ 1
Используйте 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");
Ответ 2
Я не уверен, будет ли это значительно медленнее, чем в других примерах, но это кажется более простым. Возможно, вы могли бы построить массив $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
Итак, у меня была аналогичная проблема, но я пытался упорядочить объект массивом (это не был объект). Это просто невозможно, поэтому вот мой способ:
$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, чтобы она застряла в конце.
Ответ 4
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()
, а затем добавить то, что не совпадает в конце.