【问题标题】:php build simpler array from a multidimensional (json reponse) arrayphp从多维(json响应)数组构建更简单的数组
【发布时间】:2016-09-28 15:32:31
【问题描述】:

我正在尝试将我从 Facebook 响应中获得的多维数组中的数据放入一个更简单的数组中。

json数据如下所示。

{
"albums": {
    "data": [
        {
            "photos": {
                "data": [
                    {
                        "name": "a photo name",
                        "source": "https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-xlp1/t31.0-8/s720x720/XXXXXXXXXXXX",
                        "picture": "https://fbcdn-photos-d-a.akamaihd.net/hphotos-ak-xfp1/v/t1.0-0/XXXXXXXXXXXXXX",
                    },
                    {
                        "name": "a photo name",
                        "source": "https://fbcdn-photos-d-a.akamaihd.net/hphotos-ak-xtp1/v/t1.0-0/p480x480/XXXXXXXXXXXXXXXXXX",
                        "picture": "https://fbcdn-photos-d-a.akamaihd.net/hphotos-ak-xtp1/v/t1.0-0/s130x130/XXXXXXXXXXXX",
                    },
                    {
                        "name": "a photo name",
                        "source": "https://fbcdn-photos-d-a.akamaihd.net/hphotos-ak-xtf1/v/t1.0-0/p480x480/XXXXXXXXXXXXXX",
                        "picture": "https://fbcdn-photos-d-a.akamaihd.net/hphotos-ak-xtf1/v/t1.0-0/s130x130/XXXXXXXXXXXXXXX",
                    },
                    {
                        "name": "a photo name",
                        "source": "https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xap1/v/t1.0-0/p480x480/XXXXXXXXXXXXXXXXXX",
                        "picture": "https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xap1/v/t1.0-0/s130x130/XXXXXXXXXXXX",
                    }
                ],
                "paging": {
                    "cursors": {
                        "before": "MTXXXXXXXXXXXXXXXZD",
                        "after": "MXXXXXXXXXXXXXZD"
                    }
                }
            },
        },
        {
            "photos": {
                "data": [
                    {
                        "source": "https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-xfp1/v/t1.0-9/XXXXXXXXXXXXXXX",
                        "picture": "https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xfp1/v/t1.0-0/s130x130/XXXXXXXXXXXX",
                    },
                    {
                        "name": "XXXXXXXXX",
                        "source": "https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-xpa1/v/t1.0-9/XXXXXXXXXXX",
                        "picture": "https://fbcdn-photos-a-a.akamaihd.net/hphotos-ak-xpa1/v/t1.0-0/s130x130/XXXXXXXXXXXX",
                    },
                    {
                        "name": "XXXXXXXXXXX",
                        "source": "https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-xap1/v/t1.0-9/XXXXXXXXXXX",
                        "picture": "https://fbcdn-photos-c-a.akamaihd.net/hphotos-ak-xap1/v/t1.0-0/p130x130/XXXXXXXXXXX",
                    },
                    {
                        "name": "a photo name",
                        "source": "https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xpf1/t31.0-0/p480x480/XXXXXXXXX",
                        "picture": "https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xpf1/v/t1.0-0/s130x130/XXXXXXXXXXXX",
                    },
                    {
                        "name": "a photo name",
                        "source": "https://fbcdn-photos-c-a.akamaihd.net/hphotos-ak-xpa1/t31.0-0/XXXXXXXXXXX",
                        "picture": "https://fbcdn-photos-c-a.akamaihd.net/hphotos-ak-xpt1/v/t1.0-0/XXXXXXXXXX",
                    },
                    {
                        "name": "a photo name",
                        "source": "https://fbcdn-photos-a-a.akamaihd.net/hphotos-ak-xaf1/t31.0-0/p480x480/XXXXXXXXXX",
                        "picture": "https://fbcdn-photos-a-a.akamaihd.net/hphotos-ak-xat1/v/t1.0-0/s130x130/XXXXXXXX",
                    },
                    {
                        "name": "a photo name",
                        "source": "https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xpf1/t31.0-0/p480x480/XXXXXX",
                        "picture": "https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xpf1/v/t1.0-0/s130x130/XXXXXXXX",
                    }
                ],
                "paging": {
                    "cursors": {
                        "before": "MTXXXXXXXXXXXXXXXgZDXXXX",
                        "after": "MTcXXXXXXXXXXXXXXXXXD"
                    }
                }
            },
        },
        {
            "photos": {
                "data": [
                    {
                        "source": "https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-xta1/v/t1.0-9/1",
                        "picture": "https://fbcdn-photos-a-a.akamaihd.net/hphotos-ak-xta1/v/t1.0-0/s130x130/",
                    },
                    {
                        "name": "XXXXXXXXXXXXXXXXX",
                        "source": "https://scontent.xx.fbcdn.net/v/t1.0-9/11",
                        "picture": "https://fbcdn-photos-c-a.akamaihd.net/hphotos-ak-xaf1/v/t1.0-0/s130x130/11",
                    }
                ],
                "paging": {
                    "cursors": {
                        "before": "MOIXXXXXXXXXXXXX",
                        "after": "MTXXXXXXXXXXXXXD"
                    }
                }
            },
        },
        {
            "photos": {
                "data": [
                    {
                        "source": "https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-xpl1/t31.0-8/s720x720/",
                        "picture": "https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xft1/v/t1.0-0/s130x130/",
                    }
                ],
                "paging": {
                    "cursors": {
                        "before": "MTXXXXXXXXXXXSJKSDJZDZD",
                        "after": "MTdXXXXXXXXDKSJKDNXXXXXXXXXpZD"
                    }
                }
            },
        }
    ],
    "paging": {
        "cursors": {
            "before": "MXXXXXXXXXXXXXXD",
            "after": "MXXXXXXXXXXXXJR"
        }
    }
},
"feed": {
    "data": [
        {
        },
        {
            "attachments": {
                "data": [
                    {
                        "media": {
                            "image": {
                                "height": 480,
                                "src": "https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-xpf1/t31.0-8/s720x720/",
                                "width": 720
                            }
                        }
                    }
                ]
            }
        },
        {
            "attachments": {
                "data": [
                    {
                        "media": {
                            "image": {
                                "height": 102,
                                "src": "https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-xta1/v/t1.0-9/",
                                "width": 197
                            }
                        }
                    }
                ]
            }
        },
        {
            "attachments": {
                "data": [
                    {
                        "media": {
                            "image": {
                                "height": 276,
                                "src": "https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-xpl1/t31.0-8/s720x720/",
                                "width": 720
                            }
                        }
                    }
                ]
            }
        },
        {
        },
        {
            "attachments": {
                "data": [
                    {
                        "description": "XXXXXXXXXXXXKE",
                        "media": {
                            "image": {
                                "height": 540,
                                "src": "https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-xap1/v/t1.0-9/",
                                "width": 540
                            }
                        }
                    }
                ]
            }
        },
        {
            "attachments": {
                "data": [
                    {
                        "description": "XXXXXXXXXXJ",
                        "media": {
                            "image": {
                                "height": 375,
                                "src": "https://scontent.xx.fbcdn.net/v/t1.0-9/",
                                "width": 500
                            }
                        }
                    }
                ]
            }
        },
        {
            "attachments": {
                "data": [
                    {
                        "description": "XXXXXXXXXXXX",
                        "media": {
                            "image": {
                                "height": 540,
                                "src": "https://fbcdn-photos-a-a.akamaihd.net/hphotos-ak-xaf1/v/t1.0-0/p180x540/",
                                "width": 720
                            }
                        }
                    }
                ]
            }
        },
        {
            "attachments": {
                "data": [
                    {
                        "description": "XXXXXXXXXXXXp",
                        "media": {
                            "image": {
                                "height": 405,
                                "src": "https://scontent.xx.fbcdn.net/v/t1.0-9/s720x720/",
                                "width": 720
                            }
                        }
                    }
                ]
            }
        },
        {
            "attachments": {
                "data": [
                    {
                        "media": {
                            "image": {
                                "height": 392,
                                "src": "https://scontent.xx.fbcdn.net/v/t1.0-9/",
                                "width": 626
                            }
                        }
                    }
                ]
            }
        },
        {
            "attachments": {
                "data": [
                    {
                        "description": "XXXXXXXX",
                        "media": {
                            "image": {
                                "height": 255,
                                "src": "https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-xpa1/v/t1.0-9/",
                                "width": 208
                            }
                        }
                    }
                ]
            }
        }
    ],
    "paging": {
        "previous": "https://graph.facebook.com/v2.5/1XXXXXXXXXXXX6/feed?fields=a",
        "next": "https://graph.facebook.com/v2.5/1SXXXXXXXXXXXXX96/feed?fields="
    }
},
}

我想得到一个这样的数组:

Array
(
[photo] => Array
    (
        [0] => Array
            (
                [description] => a photo name
                [image_src] => https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xpf1/t31.0-0/p480x480/XXXXXX
            )
        [1] => Array
            (
                [description] => a photo name
                [image_src] => https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xpf1/t31.0-0/p480x480/XXXXXX
            )
        [2] => Array
            (
                [description] => a photo name
                [image_src] => https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xpf1/t31.0-0/p480x480/XXXXXX
            )

            and so on......
    )
)

但我明白了:

Array
(
[photo] => Array
    (
        [0] => Array
            (
                [description] => a photo name
            )

        [1] => Array
            (
                [image_src] => https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xpf1/t31.0-0/p480x480/XXXXXX
            )
        [2] => Array
            (
                [description] => a photo name
            )

        [3] => Array
            (
                [image_src] => https://fbcdn-photos-b-a.akamaihd.net/hphotos-ak-xpf1/t31.0-0/p480x480/XXXXXX
            )
and so on...

)
)

这是我当前循环的代码:

foreach ($raw_facebook['albums']['data'] as $photos) { 
         if ($photos) {
                foreach ($photos['photos']['data'] as $photo) {
                    if ( (isset($photo['name']) && array_key_exists('name', $photo)) && (isset($photo['source']) && $this->array_key_exists_recursive('source', $photo)) ) {
                        $facebook['photo'][]['description'] = $photo['name'];
                        $facebook['photo'][]['image_src'] = $photo['source'];
                    }
                }

            }
}

当我将此代码修改为:

foreach ($raw_facebook['albums']['data'] as $photos) { 
            if ($photos) {
                $i = 0;
                foreach ($photos['photos']['data'] as $photo) {
                    if ( (isset($photo['name']) && array_key_exists('name', $photo)) && (isset($photo['source']) && $this->array_key_exists_recursive('source', $photo)) ) {
                        $facebook['photo'][$i]['description'] = $photo['name'];
                        $facebook['photo'][$i]['image_src'] = $photo['source'];
                    }
                }
                $i++;

            }
}

我得到的结果与我需要的相似,但只有 6 个内部数组(应该有 10 个),表明迭代不正确。

如果能指出正确的方向,我将不胜感激。

【问题讨论】:

  • 你应该看看array_map,它可能比所有那些foreach循环容易得多。

标签: php json facebook api multidimensional-array


【解决方案1】:

考虑使用收集管道进行此类数据处理。您最终会得到更简洁的代码(即没有 foreach > if > foreach)。

以您的代码为例(使用Knapsack):

$photos = Collection::from($raw_facebook['albums']['data'])
  ->extract('photos.data')
  ->flatten(1)
  ->filter(function (array $data) {
      return isset($data['name']) 
        && isset($data['source'])
        && $this->array_key_exists_recursive('source', $data);
  })
  ->map(function (array $data) {
      return [
        'description' => $data['name'],
        'image_src' => $data['source']
      ];
  })
  ->values()
  ->toArray();

图书馆:

【讨论】:

  • 好的,这看起来很整洁。但我几乎在项目的结尾(我不想在这个阶段实现任何新的东西).. ..我可能会稍后导入库并尝试一下,为了好玩。谢谢
  • 将库导入 Codeigniter 的难易程度如何?因为这是项目的规范
  • 好吧,只要作曲家需要它,你就可以开始了。适用于 PHP 5.6 及更高版本。没有外部依赖,所以在 CI 项目中应该没问题。
【解决方案2】:

这样做:array_push($facebook['photo'], array( 'description' => $photo['name'], 'image_src' => $photo['source'] ));

$facebook['photo'] = array();
foreach ($raw_facebook['albums']['data'] as $photos) { 
    if ($photos){
        foreach($photos['photos']['data'] as $photo) {
            if((isset($photo['name']) && array_key_exists('name', $photo)) && (isset($photo['source']) && $this->array_key_exists_recursive('source', $photo)) ){
                array_push($facebook['photo'], array( 'description' => $photo['name'], 'image_src' => $photo['source'] ));
            }
        }

    }
}

【讨论】:

  • 非常感谢@Frayne。我修改了你的第一个答案(在你编辑之前); $facebook['photo'] = array( 'description' => $photo['name'], 'image_src' => $photo['source'] );$facebook['photo'][] = array( 'description' => $photo['name'], 'image_src' => $photo['source'] ); 并使用它,因为 array_push 给了我一个错误,出于某种原因。
  • 您在编辑后尝试了吗?数组推送会产生什么错误?
  • php 错误:array_push() 期望参数 1 为数组,给定为空
  • 所以你需要先制作$facebook['photo'] = array()
  • 甜蜜!将$facebook['photo'] 初始化为空数组解决了它。谢谢!
【解决方案3】:

给你

$data = $raw_facebook['albums']['data']; //indexed array of objects
$output = array('photo'    =>   array());
for($i = 0; $i< count($data); $i++){
    $photosdataarray = $data[$i]['photos']['data'];
    for($j = 0; $j < count($photosdataarray); $j++){
        $output['photo'][]  =    array(
            'description'    =>    $photosdataarray[$j]['name'],
            'image_src'    =>    'source',
        );
    }
}

【讨论】:

  • 感谢阿迪亚。我敢打赌这也行。但我会选择@Frayne,因为这个答案将涉及过多地更改我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2014-02-01
  • 2012-12-14
  • 2019-10-14
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多