使用uasort对数组进行排序

时间:2015-01-30 18:22:44

标签: php arrays sorting

我正在开发一个小PHP函数,它将根据项目是否返回isVerified来排序数组。如果它实际上已经过验证,我希望这些结果显示在列表的顶部。我承认我不是最熟悉的PHP而且我一直在做大量的阅读,因为我认为可能有一种方法可以让这更容易。阅读它听起来像是uasort()是我需要的排序能力,它维护索引关联,但我有点困惑,如何正确使用它。我正在处理的原始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):
?>

这对我来说仍然没有用,并没有抛出任何错误,所以我有一段时间试图解决这个错误。我正在使用我正在使用的东西吗?或者这可以以更有效的方式完成吗?如果这听起来像是之前被问过的问题,我很抱歉,但在搜索时我无法找到解决方法。如果这是重复的,我非常乐意点击链接并进行更多阅读。感谢您的时间和帮助。

1 个答案:

答案 0 :(得分: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.它只接受任何值&lt; 0表示$a更小&#39;比$b,0代表相等或&gt; larger为0。因此,您当前的比较回调(可以比较数值)也可以写为return $a - $b;。您也可以像这样写下最后一行,但这不是必需的:

return ($a->lexisIndex < $b->lexisIndex ? -1 : 1);
相关问题