在php中删除基于索引的json对象名称

18 浏览
0 Comments

在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)); // 好的

谢谢。

0
0 Comments

问题: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数组输出。

0