You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:09:24