【问题标题】:Sort array with uasort使用 uasort 对数组进行排序
【发布时间】:2015-01-30 18:22:43
【问题描述】:

我正在开发一个小的 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):
?>

这对我仍然不起作用,也没有抛出任何错误,所以我花了很长时间试图解决这个问题。我的使用方法是否正确?或者这可以以更有效的方式完成吗?如果这听起来像是以前提出过的问题,我深表歉意,但我在四处搜索时找不到解决方法。如果这是重复的,我很乐意单击链接并进行更多阅读。感谢您的时间和帮助。

【问题讨论】:

    标签: php arrays sorting


    【解决方案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。它只接受任何值 $a 比 $b“小”,0 表示相等或 > 0 表示 larger。因此,您当前用于比较数值的比较回调也可以写为return $a - $b;。你也可以这样写最后一行,但这不是必须的:

    return ($a->lexisIndex < $b->lexisIndex ? -1 : 1);
    

    【讨论】:

    • 啊,就是这样!非常感谢您提供该代码以及对其背后发生的事情的解释。效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多