PHP循环输出投票选项时如何按得票数从高到低排序选项
实现方案
你可以在原有逻辑基础上新增一步排序处理即可实现,不需要大幅修改现有代码:
- 先遍历原数组把选项、对应得票数、得票占比整合为一个联合数组
- 用PHP内置的
usort()方法按得票数做降序排序 - 遍历排序后的数组输出进度条即可
完整代码示例
<?php // 此处的$sum是你之前已经计算好的总票数,如果之前没算可以加下面这行先统计总票数 $sum = array_sum($pollAnswerSet["answers"]); // 整合选项和对应投票数据 $sortedPollData = []; foreach ($poll["options"] as $optionKey => $option) { $currentVote = $pollAnswerSet["answers"][$optionKey]; $sortedPollData[] = [ 'option_content' => $option, 'vote_count' => $currentVote, 'percentage' => $sum == 0 ? 0 : floor($currentVote / $sum * 100) ]; } // 按得票数从高到低排序 usort($sortedPollData, function($itemA, $itemB) { return $itemB['vote_count'] - $itemA['vote_count']; }); // 循环输出排序后的进度条 foreach ($sortedPollData as $item) { ?> <div> <div class='progress-bar' style="width:<?= $item['percentage'] ?>%;"></div> <?= $item['percentage'] ?>% <!-- 如需展示选项内容可以加这行:<?= $item['option_content'] ?> --> </div> <?php } ?>
可选优化
如果遇到得票数相同的场景需要自定义排序规则,可以修改usort的回调函数,比如相同票数按选项名称正序排列:
usort($sortedPollData, function($itemA, $itemB) { if ($itemA['vote_count'] == $itemB['vote_count']) { return strcmp($itemA['option_content'], $itemB['option_content']); } return $itemB['vote_count'] - $itemA['vote_count']; });
如果需要保留原始选项数组的键名,可以把usort替换为uasort,不会破坏原数组的键关联关系。
内容的提问来源于stack exchange,提问作者fab69
相关产品推荐
相关产品推荐

