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代码>我得到了错误的顺序
我更新了我的答案,请再试一次。我们不需要按计数值排序,现在只需将零值放在列表的末尾。我想这就是你想要的。同样,CountValue>0的不是字母顺序。你是否正确应用了更改?我已经添加了我的输出(使用PHP7.0进行了测试)。很抱歉,我使用PHP5.6。我认为如果这个杰克:1爱丽丝:23基督:42亚历克斯:58鲍勃:0
不完整: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)); }