在php中删除基于索引的json对象名称
在php中删除基于索引的json对象名称
我试图很努力地让我的标题有意义哈哈。我有这个JSON:
[{
"0": {
"id": 130427,
"created_at": 1512521776301,
"updated_at": 1512549188911,
"category": 0,
"platform": 6,
"date": 1513987200000,
"region": 8,
"y": 2017,
"m": 12,
"human": "2017-Dec-23",
"game": 76663
},
"2": {
"id": 131795,
"created_at": 1514172411633,
"updated_at": 1514190849639,
"category": 0,
"platform": 39,
"date": 1513987200000,
"region": 8,
"y": 2017,
"m": 12,
"human": "2017-Dec-23",
"game": 78658
}
}]
如您所见,全局json中的JSON对象的位置用作对象的名称,而我不希望如此。这是我想要的:
[{
"id": 130427,
"created_at": 1512521776301,
"updated_at": 1512549188911,
"category": 0,
"platform": 6,
"date": 1513987200000,
"region": 8,
"y": 2017,
"m": 12,
"human": "2017-Dec-23",
"game": 76663
},
{
"id": 131795,
"created_at": 1514172411633,
"updated_at": 1514190849639,
"category": 0,
"platform": 39,
"date": 1513987200000,
"region": 8,
"y": 2017,
"m": 12,
"human": "2017-Dec-23",
"game": 78658
}
]
我希望对象没有名称。这是我正在使用的代码:
$json = file_get_contents('./releases.json'); $data = json_decode($json, TRUE); $region = isset($_GET['region']) ? $_GET['region'] : null; # 如果region不为空:?region=8 if ($region) { $region_filter = function($v) use ($region) { // 8 == 全球 if ($v['region'] == $region || $v['region'] == 8) { return true; } else { return false; } }; $data = array_filter($data['data'], $region_filter); } header('Content-Type: application/json'); echo json_encode(array($data)); // 好的
谢谢。
问题:PHP的json_encode()函数只有在数组键都是数字且没有任何间隔时才会产生一个数组。问题在于,array_filter()函数可以删除某些键并留下间隔,这导致json_encode()函数在输出中包含键名。可以通过使用array_values()函数在调用json_encode()之前重新索引数组来解决这个问题。
解决方法:使用array_values()函数重新索引数组。
以下是一个示例:
在上面的示例中,原始数组`$a`包含键`0`,`1`,`2`,并通过json_encode()函数转换为JSON数组。在使用array_filter()函数过滤掉`'b'`元素后,键`1`被删除,导致键间隔。通过使用array_values()函数重新索引数组,间隔被消除,最终得到了正确的JSON数组输出。