ACF复选框输出排序:优先显示Yes项并实现字母排序
排序ACF复选框选项:优先显示已勾选项并按字母排序
原始代码:
<?php $allCheckbox = get_field('sensor_types'); //Checked value from backend $field_key = "field_60e546d470762"; //Get value using key $post_id = get_the_ID(); $field = get_field_object($field_key, $post_id);?> <?php foreach($field['choices'] as $lab => $val){ if(in_array($val, $allCheckbox)){ $enable = 'Yes'; } else { $enable = 'No'; }?> <div class="ct-div-block d-data-block c-columns-2-3"> <div class="ct-div-block"><?php echo $val; ?></div> <div class="ct-div-block"><?php echo $enable ?></div> </div> <div class="d-seperator"></div> <?php } ?>
需求:优先显示enable为Yes的项,再显示No的项;同一分组内的项按$val的字母顺序排列。
解决方案:先将所有选项整理为包含状态的数组,再用自定义排序规则实现需求:
修改后的完整代码:
<?php $allCheckbox = get_field('sensor_types'); //Checked value from backend $field_key = "field_60e546d470762"; //Get value using key $post_id = get_the_ID(); $field = get_field_object($field_key, $post_id); // 整理所有选项为带enable状态的数组 $items = []; foreach($field['choices'] as $lab => $val){ $items[] = [ 'val' => $val, 'enable' => in_array($val, $allCheckbox) ? 'Yes' : 'No' ]; } // 自定义排序规则 usort($items, function($a, $b) { // 优先按enable排序:Yes排前面 if ($a['enable'] !== $b['enable']) { return $a['enable'] === 'Yes' ? -1 : 1; } // 状态相同时按字母排序(不区分大小写) return strcasecmp($a['val'], $b['val']); }); ?> <?php foreach($items as $item): ?> <div class="ct-div-block d-data-block c-columns-2-3"> <div class="ct-div-block"><?php echo $item['val']; ?></div> <div class="ct-div-block"><?php echo $item['enable']; ?></div> </div> <div class="d-seperator"></div> <?php endforeach; ?>
代码说明:
- 先遍历原始选项,将每个选项的名称和状态存入数组,避免重复判断勾选状态
- 用
usort实现自定义排序:先比较状态,已勾选(Yes)的项优先;状态相同时,用strcasecmp进行不区分大小写的字母排序 - 最后遍历排序后的数组输出内容
内容的提问来源于stack exchange,提问作者Ibrahim Jaber
相关产品推荐
相关产品推荐

