如何从数组中获取密钥

时间:2014-01-13 13:22:46

标签: php arrays array-key

我第一次使用 GCM(Google可以发送短信),我遇到了一些问题。虽然问题与GCM无关。我有一个JSON数据

$data='{"multicast_id":7917175795873320166,"success":6,"failure":0,"canonical_ids":4,

"results":[

{"registration_id":"3","message_id":"m1"},
{"message_id":"m1"},
{"message_id":"m1"},
{"registration_id":"3","message_id":"m1"},

{"registration_id":"3","message_id":"m1"},

{"registration_id":"3","message_id":"m1"}]}';

$newData=json_decode($data);

现在我想要的是设置了 registration_id 结果数组中的键,但我无法这样做。 我可以像$newData->results[0]->registration_id一样访问 registration_Id

我发现 array_keys()返回数组中的键但是如何获取$newData->results数组中$newData->results[$index]->registration_id的键的键设定? 主要问题是我无法使用foreach循环来执行此操作。希望我能在这里得到一些帮助。

3 个答案:

答案 0 :(得分:1)

不确定。首先,使用json_decode的第二个参数,这样你实际上是在处理一个数组,而不是一个对象。然后filter the array包含您想要的项目(设置registration_id的位置)和get the keys

$newData=json_decode($data, true);

$filteredResults = array_filter($newData['results'], function($item) {
    return isset($item['registration_id']);
});

print_r(array_keys($filteredResults));

工作示例:http://3v4l.org/e8doL

请注意,此代码假定您使用的是PHP 5.3或更高版本。如果您使用的是早期版本,则需要首先定义array_filter回调函数并将其传递而不是使用匿名函数。

答案 1 :(得分:1)

您只能在对象模式下处理项目的原因是由于调用json_decode的方式。

要将$ data作为关联数组返回,请使用:

$newData=json_decode($data, true)

答案 2 :(得分:1)

$newData=json_decode($data, true)

如果您传递第二个参数true,则它会将json转换为assosiative array(具有键值对的数组)。Official doc 这是官方文档Json_decode Php Official

显示

的示例
<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

?>

其输出将是

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}