PHP-按字母顺序对数组排序,但将值为0的数组移到末尾

PHP-按字母顺序对数组排序,但将值为0的数组移到末尾,php,arrays,sorting,Php,Arrays,Sorting,我有这两个功能,我需要建立一个新的,将 首先按名称对数组进行排序 然后将['countValue']=0的值移动到末尾 public function sortOptionsByName($a, $b) { $x = trim($a['label']); $y = trim($b['label']); if ($x == '') return 1; if ($y == '') return -1; if (is_numeric($x) &&a

我有这两个功能,我需要建立一个新的,将

  • 首先按名称对数组进行排序
  • 然后将
    ['countValue']=0的值移动到末尾

    public function sortOptionsByName($a, $b)
    {
        $x = trim($a['label']);
        $y = trim($b['label']);
    
        if ($x == '') return 1;
        if ($y == '') return -1;
    
        if (is_numeric($x) && is_numeric($y)){
            if ($x == $y)
                return 0;
            return ($x > $y ? 1 : -1);
        }
        else {
            return strcasecmp($x, $y);
        }
    }
    
    
    public function sortOptionsByCounts($a, $b)
    {
        if ($a['countValue'] == $b['countValue']) {
            return 0;
        }
    
        return ($a['countValue'] < $b['countValue'] ? 1 : -1);
    }
    

    您需要对数据进行两次排序,一次按名称排序,一次按计数值排序。我建议使用
    usort()
    并实现两种自定义比较方法:

    <?php
    
      function cmpName($a, $b) {
        return strnatcmp($a['Name'], $b['Name']);
      }
    
      function cmpCountValue($a, $b) {
        if ($a['CountValue'] == 0)
          return 1;
        if ($b['CountValue'] == 0)
          return -1;
        return cmpName($a, $b);
      }
    
     $a[0]['Name'] = 'Bob';
     $a[0]['CountValue'] = 0;
    
     $a[1]['Name'] = 'Christal';
     $a[1]['CountValue'] = 42;
    
     $a[2]['Name'] = 'Alice';
     $a[2]['CountValue'] = 23;
    
     $a[3]['Name'] = 'Jack';
     $a[3]['CountValue'] = 1;
    
     $a[4]['Name'] = 'Alex';
     $a[4]['CountValue'] = 58;
    
      usort($a, "cmpName");
      usort($a, "cmpCountValue");
    
      foreach ($a as $item) {
        echo $item['Name'] . ": " . $item['CountValue'] . "<br />";
      }
    
    ?>
    

    在线演示:

    首先将值与零进行比较。PHP将布尔值转换为整数,所以您只需进行减法即可得到-1,0,1。然后在第一次比较返回0时比较另一个值

    public function sortOptionsByCountsAndByName($a, $b)
    {
        $res = ($a['countValue'] == 0) - ($b['countValue'] == 0);
        return ($res ? $res : $this->sortOptionsByName($a, $b));
    }
    

    有什么问题吗?我在你的示例中又添加了两个值:
    $a[3]['Name']='Jack'$[3]['CountValue']=1$a[4]['Name']='Alex'$[4]['CountValue']=58我得到了错误的顺序
    杰克:1爱丽丝:23基督:42亚历克斯:58鲍勃:0
    我更新了我的答案,请再试一次。我们不需要按计数值排序,现在只需将零值放在列表的末尾。我想这就是你想要的。同样,CountValue>0的不是字母顺序。你是否正确应用了更改?我已经添加了我的输出(使用PHP7.0进行了测试)。很抱歉,我使用PHP5.6。我认为如果这个
    不完整:PIt遗漏了一个)在返回的最后,它似乎不起作用。。。但是谢谢你的努力,我得到了这样的东西:第一个数字是'name',括号内是'countValue',对不起,如果不是零更新,应该返回ret
    
    Alex: 58
    Alice: 23
    Christal: 42
    Jack: 1
    Bob: 0
    
    public function sortOptionsByCountsAndByName($a, $b)
    {
        $res = ($a['countValue'] == 0) - ($b['countValue'] == 0);
        return ($res ? $res : $this->sortOptionsByName($a, $b));
    }