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

时间:2018-01-31 13:31:29

标签: 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) && 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);
    }
    

像...一样的东西。

public function sortOptionsByCountsAndByName($a, $b)
{
    if ($a['countValue'] == 0 &&  $b['countValue'] == 0) {
        return -2
    }
    else {
        $this->sortOptionsByName($a, $b)
    }        
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您需要对数据进行两次排序,一次按名称排序,一次按计数值排序。我建议使用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 />";
  }

?>

输出结果为:

Alex: 58
Alice: 23
Christal: 42
Jack: 1
Bob: 0

在线演示:See here