Сортировка итераций из цикла foreach

#php #sorting

#php #сортировка

Вопрос:

У меня есть массив с именами пользователей:

 $a = array('user1','user2');
  

Я хочу использовать их для вывода информации о пользователях в виде списка, но мне нужно, чтобы она была отсортирована по их имени, которое я извлекаю из базы данных в цикле foreach, в котором они перечислены. Как мне это отсортировать?

 foreach($a as $b) {
    $user = $users->getUser($b); // gets user's details from the database
    $name = $user['name']; // I want the list to be sorted by this variable
    echo $name.'<br />';
}
  

Имена не являются уникальными, например, user1 и user1 могут иметь имя John Smith . Уникальны только имена пользователей.

Комментарии:

1. Здесь вы делаете две вещи. 1) Получить имена пользователей. 2) Выведите их по порядку. Делайте эти две вещи по одному, вместо того, чтобы пытаться сделать оба сразу, и вам будет намного проще.

2. Я понимаю, что я мог бы использовать цикл foreach для создания массива реальных имен, а затем отсортировать их соответствующим образом, но поскольку реальные имена не уникальны, я не могу использовать их для создания второго цикла foreach для извлечения дополнительных сведений о пользователе из базы данных — для этого мне нужно имя пользователя? @NiettheDarkAbsol

Ответ №1:

Это должно сработать. Теперь он сортирует по ключу name и перебирает пользователей во втором цикле.

 function sortByName($a, $b) {
    if($a['name'] !== $b['name'])
        return ($a['name'] > $b['name']) 1 : -1;
}

$a = array('user1','user2');
$userList = array();

foreach($a as $b) {
    $userList[] = $users->getUser($b);
}

usort($userList, 'sortByName');

foreach($userList as $person) {
    echo $person['name'];
}
  

Комментарии:

1. sortByName должно вернуться -1 , когда $a < $b . false будет вычисляться 0 , подразумевая $a == $b .

Ответ №2:

Используйте usort вместе с определяемым пользователем компаратором

 <?php
$users = array();
foreach($a as $b) {
    $user = $users->getUser($b); // gets user's details from the database
    $users[] = $user;
}

usort($users, 'comp_user');
foreach ($users as $user) {
    $name = $user['name'];
    echo $name.'<br />';
}

function comp_user($u1, $u2)
{
    if ($u1['name'] == $u2['name']) {
        return 0;
    }
    return ($u1['name'] < $u2['name']) ? -1 : 1;
}