【问题标题】:JSON array foreach loop with "where" attribute具有“where”属性的 JSON 数组 foreach 循环
【发布时间】:2014-03-25 02:12:04
【问题描述】:

我有一个直接来自 API 的 JSON 数组,其中一个看起来像这样:

{
    "type": "champion",
    "version": "4.4.3",
    "data": {
        "Aatrox": {
            "id": "Aatrox",
            "key": "266",
            "name": "Aatrox",
            "title": "the Darkin Blade",
            "stats": {
                "armor": 14.0,
                "armorperlevel": 3.8,
                "attackdamage": 55.0,
                "attackdamageperlevel": 3.2,
                "attackrange": 150.0,
                "attackspeedoffset": -0.04,
                "attackspeedperlevel": 3.0,
                "crit": 0.0,
                "critperlevel": 0.0,
                "hp": 395.0,
                "hpperlevel": 85.0,
                "hpregen": 5.75,
                "hpregenperlevel": 0.5,
                "movespeed": 345.0,
                "mp": 30.0,
                "mpperlevel": 45.0,
                "mpregen": 0.0,
                "mpregenperlevel": 0.0,
                "spellblock": 30.0,
                "spellblockperlevel": 1.25
            }
        },

然后它只是对所有其他英雄重复此操作。我使用 cURL 将其转换为 PHP 数组,如下所示:

$url="api_url_blah";
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url);
$result=curl_exec($ch);
$array = json_decode($result, true);

从那里,我创建了一个 foreach 循环来列出所有冠军及其“盔甲”统计数据,但是盔甲不会显示,但冠军名称会显示:

$i = 1;
foreach($array['data'] as $champs)
{

echo $champs['id']. "<br>";

    foreach($champs['stats'] as $stats) {
        echo $stats['armor'];
    }

$i++;
}

正如我所说,冠军名称出现了,但第二个 foreach 循环没有返回任何内容。另外,我想知道最方便的方法是什么(在这个工作之后)我可以根据 PHP 变量调用一个英雄的统计数据,而不是一次调用所有 118 个。

这是数组的 var_dump():

array(3) { ["type"]=> string(8) "champion" ["version"]=> string(5) "4.4.3" ["data"]=> array(118) { ["Aatrox"]=> array(5) { ["id"]=> string(6) "Aatrox" ["key"]=> string(3) "266" ["name"]=> string(6) "Aatrox" ["title"]=> string(16) "the Darkin Blade" ["stats"]=> array(20) { ["armor"]=> float(14) ["armorperlevel"]=> float(3.8) ["attackdamage"]=> float(55) ["attackdamageperlevel"]=> float(3.2) ["attackrange"]=> float(150) ["attackspeedoffset"]=> float(-0.04) ["attackspeedperlevel"]=> float(3) ["crit"]=> float(0) ["critperlevel"]=> float(0) ["hp"]=> float(395) ["hpperlevel"]=> float(85) ["hpregen"]=> float(5.75) ["hpregenperlevel"]=> float(0.5) ["movespeed"]=> float(345) ["mp"]=> float(30) ["mpperlevel"]=> float(45) ["mpregen"]=> float(0) ["mpregenperlevel"]=> float(0) ["spellblock"]=> float(30) ["spellblockperlevel"]=> float(1.25) } }

【问题讨论】:

  • @zerkms var_dump() 究竟是什么?
  • stats 不是data 的子数组
  • @user1895377: 每个变量,如果你没有任何特别的嫌疑人
  • 我的错,很难用肉眼解码json
  • @user1895377:天啊。 停止猜测,检查var_dump 你有什么实际数据。您对$champs['stats'] 有疑问吗?核实。对$stats 中的内容感到困惑?核实。编程是关于事实,而不是关于信念。

标签: php arrays json foreach


【解决方案1】:

您不需要第二个foreach 循环。以下代码应该可以工作:

$i = 1;
foreach($array['data'] as $champs){
echo $champs['id'] . "<br/>" . $champs['stats']['armor'] . "<br/>";
$i++;
}

【讨论】:

  • @andrew 我不知道。也许问题的作者需要它来计算迭代次数。但是他/她应该以$i = 0开头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2014-10-14
  • 2014-10-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
相关资源
最近更新 更多