Сортировать массив с помощью uasort

0

Я работаю над небольшой PHP-функцией, которая будет сортировать массив на основе, если возвращаемый элемент был isVerified или нет. Если это действительно подтверждено, я бы хотел, чтобы эти результаты отображались в верхней части списка. Я признаю, что я не самый знакомый с PHP, и я много читаю, так как понял, что может быть способ сделать это проще. Чтение вокруг звучало так, как будто uasort() был тем, что мне нужно для его сортировки, и что он поддерживает ассоциацию индексов, но Im немного запутался, как правильно его использовать. Исходный блок PHP, над которым я работаю, выглядит так:

<?php
  if (count($results)):

  $lexisIndex = 1;

  foreach ($results as $person){
    $person->isVerified = (substr($person->first_name, 0, 1) == substr($fname, 0, 1) && $person->last_name == $lname );                                     
    $person->lexisIndex = $lexisIndex++;
  }

  foreach ($results as $person):
?>

Отсюда я помещал $results в массив и передавал его в функцию uasort. После того, как я добавил то, что мне казалось нужным, код выглядел так:

<?php
    if (count($results)):

        $lexisIndex = 1;

        foreach ($results as $person){
            $person->isVerified = (substr($person->first_name, 0, 1) ==  substr($fname, 0, 1) && $person->last_name == $lname );
            $person->lexisIndex = $lexisIndex++;
        }

        $array = array($results);

        uasort($array, function($a, $b) {
        if ($a == $b) {
            return 0;
        }
        return ($a < $b ? -1 : 1);
    });

    foreach ($results as $person):
?>

Это все еще не работало для меня и не делало никаких ошибок, поэтому у меня есть время, пытаясь разобраться в этом. Я на правильном пути с тем, что я использую? Или это можно сделать более эффективным образом? Я прошу прощения, если это звучит как вопрос, который был задан раньше, но я не мог найти исправление во время поиска. Если это дубликат, я более чем счастлив щелкнуть ссылку и сделать еще немного чтения. Спасибо за ваше время и помощь.

Теги:
arrays
sorting

1 ответ

1
Лучший ответ

$a и $b - это элементы массива. Итак, в вашем случае это объекты человека, и как вы должны их сравнивать:

uasort($array, function($a, $b) {
    // isVerified is most important. Move to top.
    if ($a->isVerified != $b->isVerified ) {
      return ($a->verified ? -1 : 1);
    }
    // If neither or both are verified, compare based on lexisindex.
    return $a->lexisIndex - $b->lexisIndex;
});

Последняя строка - это просто ярлык. Функция сравнения не должна возвращать -1, 0 или 1. Она просто принимает любое значение <0, чтобы указать, что $a меньше, чем $b, 0 для равенства или> 0 для larger. Таким образом, ваш текущий обратный вызов сравнения, который будет сравнивать числовые значения, также может быть просто записан как return $a - $b; , Вы также можете написать последнюю строку, как это, но это не обязательно:

return ($a->lexisIndex < $b->lexisIndex ? -1 : 1);
  • 1
    Ах, вот оно! Большое спасибо за этот код и объяснение того, что происходит за ним. Это сработало идеально.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню