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

PHP多维数组特殊排序需求:CLASS=1按价升序,其余按价升序

多维数组自定义多条件排序解决方案

需求梳理

先明确你的排序规则和预期结果:

原始数组

IDCLASSPRICENAME
11400Product 1
23120Product 2
31350Product 3
42600Product 4
52320Product 5

排序规则

  • CLASS=1的元素:单独按PRICE升序排列,且这部分元素要排在所有CLASS≠1的元素前面
  • CLASS≠1的元素:仅按PRICE升序排列,无需考虑CLASS
  • 预期排序结果:ID3 → ID1 → ID2 → ID5 → ID4

现有函数的问题

你当前的sortMultiArray函数只能处理常规的字段排序,无法实现这种「分组后组内排序」的逻辑,需要新增自定义分组的排序键来实现。

修改后的函数实现

下面是调整后的函数,专门针对你的需求做了适配,同时保留了原函数的多参数扩展能力:

function sortMultiArray() {
    $args = func_get_args();
    $data = array_shift($args);
    
    // 生成自定义排序键:先区分CLASS是否为1,再按价格排序
    $groupSortKeys = [];
    $priceSortKeys = [];
    foreach($data as $key => $row) {
        // CLASS=1的元素标记为0,确保排在前面;其余标记为1
        $groupSortKeys[$key] = $row['CLASS'] === 1 ? 0 : 1;
        $priceSortKeys[$key] = $row['PRICE'];
    }
    
    // 将自定义排序规则插入到参数最前面,作为核心排序条件
    array_unshift($args, $groupSortKeys, SORT_ASC, $priceSortKeys, SORT_ASC);
    
    // 保留原函数的字符串字段处理逻辑(处理特殊值替换)
    foreach($args as $n => $field) {
        if (is_string($field)) {
            $tmp = [];
            foreach($data as $key => $row) {
                $tmp[$key] = str_replace("-1", "999999999", $row[$field]);
            }
            $args[$n] = $tmp;
        }
    }
    
    $args[] = &$data;
    call_user_func_array('array_multisort', $args);
    return array_pop($args);
}

// 用法示例:直接调用即可满足你的需求
$sortedArray = sortMultiArray($array);

逻辑说明

  1. 分组标记:通过$groupSortKeys给每个元素打标记,CLASS=1的元素标记为0,其余为1,这样在升序排序时,CLASS=1的元素会自动排在前面
  2. 组内排序:$priceSortKeys存储每个元素的价格,作为第二排序条件,实现同一分组内的价格升序
  3. 兼容原逻辑:保留了原函数对字符串字段的特殊值替换处理,不影响其他场景的多条件排序使用

测试这个函数后,输出结果会完全符合你的预期:ID3(350,CLASS=1)→ ID1(400,CLASS=1)→ ID2(120,CLASS≠1)→ ID5(320,CLASS≠1)→ ID4(600,CLASS≠1)

内容的提问来源于stack exchange,提问作者sylar32

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:37:39