PHP循环从解码的JSON中检索特定数据片段的每个实例

时间:2019-03-06 17:13:05

标签: php json loops foreach

我正在尝试编写一个循环,该循环将列出JSON数据中的所有uiduid分为两类(衬衫和裤子)。以下是到目前为止的内容。任何帮助是极大的赞赏。

当前代码和JSON

$url = 'http://foothillertech.com/student/webdesign/2018/2018benrud2/projects/retail/data2.json';
$jsonData = file_get_contents($url);
$data = json_decode($jsonData, true);

我可以通过uid手动获得每个$data['shirts'][0]['uid'],但是我正在寻找一种遍历数据的方法,以返回衬衫和裤子类别中的所有uid。

谢谢!

这是解决我问题的代码。

谢谢@不要惊慌!

foreach ($data as $item_type => $items) {
    foreach ($items as $item) {
        $uids[] = $item['uid'];
        echo $uids[$i]."<br>";
        $i++;
    }
}

2 个答案:

答案 0 :(得分:3)

您可以合并第二级数组(衬衫和裤子的按键),并从结果中获取uid列。

$uids = array_column(array_merge(...array_values($data)), 'uid');

此表达式的详细信息由内而外(PREVIOUS表示上一步的结果):

  • array_values($data)将外部数组的字符串键(“衬衫”,“裤子”)转换为数字
  • array_merge(... PREVIOUS )合并两个内部数组,并使用argument unpacking将它们传递到array_merge。 (需要进行上一步array_values,因为参数解压缩将不适用于带有字符串键的数组。)
  • array_column( PREVIOUS , 'uid')从前面步骤生成的合并数组中获取所有'uid'值

尽管如此,这是一种花哨的方式来做一些相当简单的事情。如果仅使用嵌套循环,则代码将更加清晰。

foreach ($data as $item_type => $items) {
    foreach ($items as $item) {
        $uids[] = $item['uid'];
    }
}

答案 1 :(得分:0)

就像@ jon-stirling提到的那样,您可以使用array_column()从数组的符号列中提取值。它做的许多其他事情超出了您的问题范围。在http://php.net/manual/en/function.array-column.php

签出

专门针对您的示例,以下代码应为您提供从uid中提取的所有$data['shirts']

$url = 'http://foothillertech.com/student/webdesign/2018/2018benrud2/projects/retail/data2.json';
$jsonData = file_get_contents($url);
$data = json_decode($jsonData, true);
$shirtsUids = array_column($data['shirts'], 'uid');
$pantsUids = array_column($data['pants'], 'uid');

// Then you can use $shirtsUids and $pantsUids as you see fit.

请确保$ data数组中有一个名为Shirt的密钥,否则将引发错误或警告。

为避免引起错误,我使用Null合并运算符(??)将不确定值默认设置为可接受的值。因此,我将使用$data['shirts'] ?? []。但同样,请确保$ data ['shirts']是一个数组。

$url = 'http://foothillertech.com/student/webdesign/2018/2018benrud2/projects/retail/data2.json';
$jsonData = file_get_contents($url);
$data = json_decode($jsonData, true);
$shirtsUids = array_column($data['shirts'] ?? [], 'uid');
$pantsUids = array_column($data['pants'] ?? [], 'uid');

// Then you can use $shirtsUids and $pantsUids as you see fit.