PHP:嵌套的 json 和值提取

标签 php foreach json

我在下面有这个 json。我正在尝试使用 json_decode 获取值。我得到了一些值,但我在处理深层嵌套的值时遇到了麻烦。这是 json:

{
"startAt": 0,
"issue": [
{
    "id": "51526",
    "fields": {
        "people": [
            {
                "name": "bob",
                "emailAddress": "bob@gmail.com",
                "displayName": "Bob Smith",
            },
            {
                "name": "john",
                "emailAddress": "john@gmail.com",
                "displayName": "John Smith",
            }
        ],
        "skill": {
            "name": "artist",
            "id": "1"
        }
    }
},
{
    "id": "2005",
    "fields": {
        "people": [
            {
                "name": "jake",
                "emailAddress": "jake@gmail.com",
                "displayName": "Jake Smith",
            },
            {
                "name": "frank",
                "emailAddress": "frank@gmail.com",
                "displayName": "Frank Smith",
            }
        ],
        "skill": {
            "name": "writer",
            "id": "2"
        }
    }
}
]

}

我知道这样做可以获得一个值:

foreach ($decoded_array['issue'][0]['fields']['people'] as $person) {
  echo $person['emailAddress'];
}

但是,有没有一种简单的方法可以获取 bob、john、jake 和 frank 的所有“emailAddresses”?

谢谢!

最佳答案

最简单的方法实际上就是循环,但首先在 $decoded_array['issue'] 嵌套循环,然后在 ['people'] 上嵌套循环。将您的地址收集到输出数组中。

// Note: this assumes you called json_decode() with the second
// param TRUE to force an associative array..
// $decoded_array = json_decode($input_json, TRUE);

$addresses = array();
foreach ($decoded_array['issue'] as $i) {
  foreach ($i['fields']['people'] as $person) {
    // Append the address onto an output array
    $addresses[] = $person['emailAddress'];
  }
}
// De-dupe them if necessary
$addresses = array_unique($addresses);
print_r($addresses);

// Prints
Array
(
    [0] => bob@gmail.com
    [1] => john@gmail.com
    [2] => jake@gmail.com
    [3] => frank@gmail.com
)

如果您不确定除了键名 emailAddress 之外的结构,一个稍微高级的方法是使用 array_walk_recurisve()遍历数组寻找那个键。这将收集名为 emailAddress所有键,而不仅仅是 ['people'] 子数组中的键。

$addresses = array();
// Pass $addresses into the closure by reference so you can write to it
array_walk_recursive($decoded_array, function($value, $key) use (&$addresses) {
  // Find *all keys* called emailAddress
  if ($key == 'emailAddress') {
    $addresses[] = $value;
  }
});

关于PHP:嵌套的 json 和值提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22851241/

相关文章:

php - 在引用日期的 MySQL 表中创建唯一键

javascript - Foreach HTML 元素放入 javascript-array

php - 按字母顺序排列数组结果 PHP

java - 使用 hibernate 在 Mysql 5.7 数据库中存储/检索 Json 数据

javascript - 使用 Angular.JS 将 JSON 导入 HTML(错误)!

php - 如何将图像添加到php mysql数据库?

php - 使用 ctype_alpha 时允许撇号?

php - 从表 JOIN 中获取两个字段的值

php foreach循环每2个元素包装一次,然后每3个元素包装一次

javascript - AJAX一次调用将多组数据插入到单独的div中