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

如何在PHP中根据指定键重新排列JSON对象?

在PHP中按指定键重新排列JSON中的对象数组

嘿,这事儿不难,我给你拆解成两种常见的场景来处理——毕竟「重新排列」可能是指按指定键分组,也可能是按指定键排序,两种需求的实现方式不一样。咱们一步步来:

第一步:先把JSON解析成PHP数组

不管哪种操作,第一步都是把JSON字符串转成PHP能操作的关联数组,用json_decode()就行,记得第二个参数传true,这样会转成关联数组而不是对象:

// 你的原始JSON字符串
$jsonStr = '{ "result": [{ "questionId": "1", "sectionId": "1", "questionText": "Foo bar blah blah", "questionType": "R" }, { "questionId": "2", "sectionId": "1", "questionText": "qoox foo", "questionType": "R" }, { "questionId": "3", "sectionId": "2", "questionText": "Hello world", "questionType": "D" }, { "questionId": "4", "sectionId": "2", "questionText": "asdasdasd", "questionType": "R" }, { "questionId": "5", "sectionId": "3", "questionText": "to be or not to ..." }] }';

// 解析为关联数组
$data = json_decode($jsonStr, true);
// 取出里面的问题数组
$questions = $data['result'];

场景1:按指定键分组(比如按sectionId归类)

如果你的需求是把相同sectionId的问题放到一起,形成以sectionId为键的分组数组,可以用循环遍历实现:

// 初始化分组数组
$groupedData = [];

foreach ($questions as $question) {
    // 取出要分组的键值
    $sectionKey = $question['sectionId'];
    
    // 如果该分组还不存在,先创建空数组
    if (!isset($groupedData[$sectionKey])) {
        $groupedData[$sectionKey] = [];
    }
    
    // 将当前问题加入对应分组
    $groupedData[$sectionKey][] = $question;
}

// 转成格式化后的JSON输出(方便查看)
echo json_encode($groupedData, JSON_PRETTY_PRINT);

运行后,输出的JSON会是这样的结构:

{
    "1": [
        {"questionId":"1", ...},
        {"questionId":"2", ...}
    ],
    "2": [
        {"questionId":"3", ...},
        {"questionId":"4", ...}
    ],
    "3": [
        {"questionId":"5", ...}
    ]
}

场景2:按指定键排序(比如按questionType或sectionId排序)

如果是要把整个问题数组按某个键的顺序重新排列(比如升序/降序),可以用PHP的usort()函数,配合自定义的比较回调:

示例1:按sectionId升序排序

// 用usort排序,回调函数定义比较规则
usort($questions, function($a, $b) {
    // 因为sectionId是字符串类型,用strcmp比较;如果是数字直接用$a['sectionId'] - $b['sectionId']
    return strcmp($a['sectionId'], $b['sectionId']);
});

// 转回JSON输出(保持原result结构)
echo json_encode(['result' => $questions], JSON_PRETTY_PRINT);

示例2:按questionType降序排序

如果要倒序,只要把回调里的$a和$b调换位置就行:

usort($questions, function($a, $b) {
    // 降序排列questionType
    return strcmp($b['questionType'], $a['questionType']);
});

额外提示:处理键不存在的情况

如果怕某些问题对象没有目标键(比如你的第5个问题就没questionType),可以在回调里加个判断,避免报错:

$targetKey = 'questionType';
usort($questions, function($a, $b) use ($targetKey) {
    $valA = isset($a[$targetKey]) ? $a[$targetKey] : '';
    $valB = isset($b[$targetKey]) ? $b[$targetKey] : '';
    return strcmp($valA, $valB);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:17:35