【问题标题】:Why is this PHP if condition always true?如果条件总是为真,为什么这个 PHP 是真的?
【发布时间】:2015-08-19 19:46:23
【问题描述】:

所以现在我正在使用这个请求从 json API (battle.net) 中提取数据

https://us.api.battle.net/wow/realm/status?locale=en_US&realms=runetotem&apikey=xxxxxxxxxxxxxxx

API 密钥被故意隐藏,这将返回以下内容

{
  "realms": [{
    "type": "pve",
    "population": "medium",
    "queue": false,
    "wintergrasp": {
      "area": 1,
      "controlling-faction": 1,
      "status": 0,
      "next": 1433468324674
    },
    "tol-barad": {
      "area": 21,
      "controlling-faction": 1,
      "status": 2,
      "next": 1433465638814
    },
    "status": true,
    "name": "Runetotem",
    "slug": "runetotem",
    "battlegroup": "Vengeance",
    "locale": "en_US",
    "timezone": "America/Los_Angeles",
    "connected_realms": ["uther", "runetotem"]
  }]
}

我使用 php 将其放入数组中,然后尝试在 if 语句中调用所述数组中的值,但是 if 语句始终为我的检查触发 true。我完全不明白为什么,如果有人可以请帮忙,那就太好了。代码如下。

<?php 
$json_url = "https://us.api.battle.net/wow/realm/status?locale=en_US&realms=runetotem&apikey=xxxxxxxxxxx";
$json = file_get_contents($json_url);
$data = json_decode($json, TRUE);
?>

<tr class="latestthreads_portal">

<td width="230px" class="trow3">
<strong>Realm Status</strong>
<span class="smalltext"><br />
<?php if ($data['realms'][0]['status'] == 2)
{
    echo "up";
    }
    else{
    echo "Down?";
    }
?>
    <br />

  <br /> <div class="border"></div>
</span>
</td>
</tr>

请原谅糟糕的格式,匆忙。

【问题讨论】:

  • 调试它,回显 | (var_dump()) 你正在检查的值
  • 尝试检查类型,所以if($data['realms'][0]['status'] === 2)
  • $data['realms'][0]['status'] 设置为 true。你的意思是$data['realms'][0]['wintergrasp']['status']

标签: php arrays json variables if-statement


【解决方案1】:

我认为您有比较问题和数据嵌套问题。在我看来,您正在比较 if (2 == true),它在 php 中的计算结果为 truehttp://php.net/manual/en/types.comparisons.php

此外,您只检查“领域”数组的状态,而不是“tol-barad”和“wintergrasp”对象的状态,不确定您想要什么。

【讨论】:

  • 我怎么没有意识到 2 在 php.ini 中是正确的。撕裂。是的,我故意只检查领域数组的状态。谢谢你们的帮助。
  • 这就是我们使用===比较操作数的原因。
【解决方案2】:

查看您提供的 JSON,$data['realms'][0]['status'] 的值似乎是 true

因此,您的 if 语句将进行类型处理以使双方都作为布尔值,(bool)2 为真,因此条件将始终匹配。

【讨论】:

  • 感谢您的帮助:)
【解决方案3】:

您确定要:

$data['realms'][0]['status'] == 2

而不是

$data['realms']['wintergrasp']['status'] == 2

根据评论编辑:

if ($data['realms']['status'] == 2)

【讨论】:

  • 见上文,我故意只检查领域的状态。
【解决方案4】:

在 PHP 中比较不同类型时,请使用 === 而不是 ==。总是。三个等号表示“是否相同?”两个等号表示“这是等价的吗?”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2017-11-17
    相关资源
    最近更新 更多