Я работаю над небольшой 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):
?>
Это все еще не работало для меня и не делало никаких ошибок, поэтому у меня есть время, пытаясь разобраться в этом. Я на правильном пути с тем, что я использую? Или это можно сделать более эффективным образом? Я прошу прощения, если это звучит как вопрос, который был задан раньше, но я не мог найти исправление во время поиска. Если это дубликат, я более чем счастлив щелкнуть ссылку и сделать еще немного чтения. Спасибо за ваше время и помощь.
$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);