如何在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
相关产品推荐
相关产品推荐

