持续迭代 API 响应,可能是一个对象或对象数组

问题描述 投票:0回答:2

我有以下 JSON 代码。

{
  "Artikelnr":"1000",
  "Vooraad_NL":2.0,
  "Voorraad_DE":1.0,
  "Voorraad_BE":0.0
}

当我用 foreach 循环 json 时,它循环 4 次。我怎样才能让它只循环浏览文章数量。就像 1 篇文章只循环一次。当有3篇文章时,json循环3次。

我使用以下 php 代码:

$data = json_decode(file_get_contents('php://input'), true);

if ((isset($data) && $data != "") && (json_last_error() === JSON_ERROR_NONE)) {

foreach ($data as $key => $val) {
    $articlenumber = $data['Artikelnr'];
    $voorraad_nl = $data['Vooraad_NL'];
    $voorraad_de = $data['Vooraad_DE'];
    $voorraad_be = $data['Vooraad_BE'];
}

}
php arrays object types foreach
2个回答
4
投票

您有以下

json

{
  "Artikelnr":"1000",
  "Vooraad_NL":2.0,
  "Voorraad_DE":1.0,
  "Voorraad_BE":0.0
}

所以,当你在

json_decode
之后循环播放时,你会得到这样的结果:

Array
(
    [Artikelnr] => 1000
    [Vooraad_NL] => 2
    [Voorraad_DE] => 1
    [Voorraad_BE] => 0
)

所以,当你循环 $data 时:

$data = json_decode(file_get_contents('php://input'), true);

foreach ($data as $key => $val) {
    $articlenumber = $data['Artikelnr'];
    $voorraad_nl = $data['Vooraad_NL'];
    $voorraad_de = $data['Vooraad_DE'];
    $voorraad_be = $data['Vooraad_BE'];
}

循环正在迭代包含 4 个项目的

$data
数组,并且您没有在循环内使用
$key/$val
而是使用
$data
本身,因此您会看到相同的项目 4 次。

如果你只有一个

json
那么你不需要循环,你可以简单地做同样的事情而不需要循环,例如:

echo $data['Artikelnr'];
echo $data['Vooraad_NL'];
echo $data['Voorraad_DE'];
echo $data['Voorraad_BE'];

如果您不确定结果是对象数组还是单个对象,您可以尝试这样的操作:

// Decode without passing the true in the json_encode
$data = json_decode(file_get_contents('php://input'));

if (is_object($data)) {
    $data->Artikelnr;
    $data->Vooraad_NL;
    $data->Vooraad_DE;
    $data->Vooraad_BE;
} else {
    foreach ($data as $item) {
        $articlenumber = $item->Artikelnr;
        $voorraad_nl   = $item->Vooraad_NL;
        $voorraad_de   = $item->Vooraad_DE;
        $voorraad_be   = $item->Vooraad_BE;
    }
}

如果您想将每个项目用作数组,那么您可以使用

(array)
转换对象(stdClass),例如:

foreach ($data as $item) {
    $item = (array) $item;
    // Now you can use the item as an array
    $articlenumber = $item['Artikelnr'];
    // ...
}

对于单个对象也可以这样做,例如:

if (is_object($data)) {
    $data = (array) $data;
    $articlenumber = $data['Artikelnr'];
}

1
投票

我建议有条件地将任何遇到的对象转换为 objectArrays,并无条件编写循环来迭代 objectArray。

所有应用程序都应努力稳定其输入/输出数据类型,以实现更简化的脚本编写(遗憾的是您正在访问的端点没有考虑到这一点)。

代码:(演示

$data = json_decode($response);
if (is_object($data)) {
    $data = [$data];
}
foreach ($data as $obj) {
    var_dump($obj);
}
© www.soinside.com 2019 - 2024. All rights reserved.