从PHP数组中获取特定值

时间:2013-04-22 13:01:51

标签: php foreach

我有以下json:

{
  "data": [
    {
      "id": "116376655202954/insights/page_impressions_organic/day", 
      "name": "page_impressions_organic", 
      "period": "day", 
      "values": [
        {
          "value": 13059, 
          "end_time": "2013-02-22T08:00:00+0000"
        }, 
        {
          "value": 15223, 
          "end_time": "2013-02-23T08:00:00+0000"
        },

我使用PHP获取valueend_time以下foreach的值:

foreach ($page_impressions_organic['data'] as $page_impression_organic) {
    foreach($page_impression_organic['values'] as $key => $page_impression_organic_values) {
        $end_time = strval($page_impression_organic_values['end_time']);
        $ds = substr($end_time, 0, -14);
        $value = intval($page_impression_organic_values['value']);
        echo '[\'' . $ds . '\', ' . $value . ']';
}}

一切都像它应该的那样工作,我的问题是现在我有一个不同的json:

{
  "data": [
    {
      "id": "116376655202954/insights/page_storytellers_by_story_type/day", 
      "name": "page_storytellers_by_story_type", 
      "period": "day", 
      "values": [
        {
          "value": {
            "fan": 2043, 
            "page post": 293, 
            "user post": 5
          }, 
          "end_time": "2013-02-22T08:00:00+0000"
        }, 
        {
          "value": {
            "fan": 1085, 
            "page post": 398, 
            "user post": 5
          }, 
          "end_time": "2013-02-23T08:00:00+0000"
        }, 

并且我无法获得相同的结果,因为value是一个数组,我特别需要它的page post值。我需要保留我的回声用于进一步范围的形式。我已经为这样做了另一个foreach:

foreach ($page_talking_abouts['data'] as $page_talking_about) {
    foreach($page_talking_about['values'] as $key => $page_talking_about_values) {
        foreach($page_talking_about_values['value'] as $page_talking_about_value) {
            $end_time = strval($page_talking_about_values['end_time']);
            $ds = substr($end_time, 0, -14);
            $value = intval($page_talking_about_value['page post']);
            echo '[\'' . $ds . '\', ' . $value . ']';
}}}

$value每次都是0 ......我该怎么办?

3 个答案:

答案 0 :(得分:2)

它死得很简单。请参阅重写的代码:

foreach ($page_talking_abouts['data'] as $page_talking_about) {
    foreach($page_talking_about['values'] as $key => $page_talking_about_values) {
        $end_time = strval($page_talking_about_values['end_time']);
        $ds = substr($end_time, 0, -14);
        $value = intval($page_talking_about_values['value']['page post']);
        echo '[\'' . $ds . '\', ' . $value . ']';
    }
}

如果您只需要一个已知的索引,那么您真的不需要遍历内部值数组。您的解决方案中发生的情况是,对于嵌套值数组中的每个,您尝试获取索引page post,但由于嵌套数组的值不是数组索引{{ 1}}返回page post,如果输入null,则转换为0

除此之外,我真的建议将变量重命名为更具可读性的东西。那些具有细微差别的长名称使得难以阅读代码。

答案 1 :(得分:1)

我认为你不需要第三个for循环,因为value数组每end-time只存在一次。

尝试更改您的代码:

foreach ($page_talking_abouts['data'] as $page_talking_about) {
    foreach($page_talking_about['values'] as $key => $page_talking_about_values) {

        // note: removed third for-loop

        $end_time = strval($page_talking_about_values['end_time']);
        $ds = substr($end_time, 0, -14);

        // note: changed this line to directly read out the page posts
        $value = intval($page_talking_about_values['value']['page post']);

        echo '[\'' . $ds . '\', ' . $value . ']';
}}

答案 2 :(得分:0)

你不应该直接循环它。使用json_decode解码字符串,然后执行foreach循环,然后再次json_encode