遍历数组PHP中的对象

时间:2017-10-12 14:25:03

标签: php arrays

我的PHP正在接收这样的数据:

if !findNoCase( styleString, 'BebasNeue'){
styleString = REReplace(style, 'font-family:[^"|^;]*', "font-family:swiss7; font-size:12", "ALL");
}

所以,我接着做了这样的事情:

[
    {
      "EMAIL": "hello@example.com",
      "GENDER": "Male"
    },
    {
      "EMAIL": "info@example.com",
      "GENDER": "Male"
    }
  ]

问题是$entityBody=json_decode($data); //$data like the array above foreach($entityBody as $value){ $email = $value->EMAIL; //do something with $email 只运行一次,我可以成功处理第一个对象中的电子邮件地址。但其余的都被忽略了。因此,就上述数据而言,我只需获取hello@example.com,而不是info@example.com。

如何调整foreach

编辑:完整代码遵循Sendgrid要求您发送它的janky方式。

foreach

1 个答案:

答案 0 :(得分:0)

第一

使用json_decode时,返回的值是关联数组而不是对象。

因此,您的代码$value->EMAIL无效。

<强>第二

解码后的JSON会变成这样:

[
    [
      "EMAIL" => "hello@example.com",
      "GENDER" => "Male"
    ],
    [
      "EMAIL" => "info@example.com",
      "GENDER" => "Male"
    ]
]

因此,在foreach ($entityBody as $value)中,$value指向数组而不是值。

因此,$email = $value['EMAIL']也会失败。

<强>解决方案

使用双foreach

$data = '[
    {
        "EMAIL": "hello@example.com",
        "GENDER": "Male"
    },
    {
        "EMAIL": "info@example.com",
        "GENDER": "Male"
    }
]';

$entityBody = json_decode($data);

foreach ($entityBody as $value){

    // Remember $value === array
    foreach ($value as $key => $val){

        // You can process your data here
        if ($key === 'EMAIL')
            echo "Email: {$val}<br>";
        else if ($key === 'GENDER')
            echo "Gender: {$val}<br>";

    }

}

您可以通过在PhpFiddle

中对其进行复制粘贴来运行上述代码

修改

Apparently json_decode returns object for {...} data format

所以你可以使用以下代码:

foreach ($entityBody as $value){
    $email = isset($value->EMAIL) ? $value->EMAIL : false;
    $gender = isset($value->GENDER) ? $value->GENDER : false;
}

这使您的代码完美无缺。

我认为使您的代码只运行一次的原因是,在foreach的第二次迭代中,找不到值$value->EMAIL,因此抛出错误并中断执行。

解决方案首先使用isset()检查数据。