如何用PHP移除合并后JSON中project_id为16的块
问题
我使用PHP脚本合并两个JSON文件,已得到合并后的输出结果。现需移除所有包含"project_id": 16的JSON块,请问该如何实现?
解决方案
这其实很容易实现,核心思路就是把JSON转成PHP数组后过滤掉不符合条件的元素,再转回JSON就行。我给你写个完整的示例,你可以根据自己的实际情况调整:
// 先获取合并后的JSON内容——如果是存在文件里,就用file_get_contents读取 $mergedJson = file_get_contents('merged.json'); // 将JSON解码为PHP关联数组(第二个参数true很关键,不然会得到对象) $dataArray = json_decode($mergedJson, true); // 用array_filter过滤掉所有project_id等于16的元素 $filteredArray = array_filter($dataArray, function($item) { // 先检查project_id键是否存在,避免无该键的元素引发警告 return isset($item['project_id']) && $item['project_id'] !== 16; }); // 可选:如果需要重置数组索引(因为array_filter会保留原索引,JSON数组不影响,但看起来更整洁) $filteredArray = array_values($filteredArray); // 把过滤后的数组重新编码为JSON,JSON_PRETTY_PRINT让输出格式更美观 $filteredJson = json_encode($filteredArray, JSON_PRETTY_PRINT); // 可以选择输出结果,或者写入新文件 echo $filteredJson; // file_put_contents('filtered_merged.json', $filteredJson);
关键点说明:
json_decode($mergedJson, true):一定要加第二个参数true,这样才能把JSON对象转成PHP的关联数组,方便后续操作;如果不加,得到的是stdClass对象,过滤的时候写法会略有不同(比如$item->project_id)。- 过滤回调里的
isset($item['project_id']):这一步是为了容错——如果你的JSON里有些块没有project_id这个键,不会因为访问不存在的键而抛出警告。 array_values($filteredArray):array_filter会保留原数组的索引,比如过滤掉第二个元素后,数组索引会是0、2...,虽然JSON数组不关心索引顺序,但重置后索引连续,看起来更规范,属于可选操作。
内容的提问来源于stack exchange,提问作者Markus Ritzmann
相关产品推荐
相关产品推荐

