Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
部族API PHP与嵌套JSON问题的冲突_Php_Json - Fatal编程技术网

部族API PHP与嵌套JSON问题的冲突

部族API PHP与嵌套JSON问题的冲突,php,json,Php,Json,我的PHP加载有问题。我使用PHP调用Clash of Clans API JSON。这是我在JSON中要查找的位置:“氏族”>“成员”>“最佳对手战术” 这是我的PHP <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <?php $clantag = "<CLAN OMITTED>"; $token = "<

我的PHP加载有问题。我使用PHP调用Clash of Clans API JSON。这是我在JSON中要查找的位置:“氏族”>“成员”>“最佳对手战术”

这是我的PHP

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
<?php
$clantag = "<CLAN OMITTED>";

$token = 

"<TOKEN OMITTED>";

$url = "https://api.clashofclans.com/v1/clans/" . urlencode($clantag) . "/currentwar";

$ch = curl_init($url);

$headr = array();
$headr[] = "Accept: application/json";
$headr[] = "Authorization: Bearer ".$token;

curl_setopt($ch, CURLOPT_HTTPHEADER, $headr);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$res = curl_exec($ch);
$data = json_decode($res, true);
curl_close($ch);

if (isset($data["reason"])) {
  $errormsg = true;
}

$members = $data["clan"]["members"];

?>
  <title><?php echo $data["clan"]["name"]; ?></title>
</head>
<body>
<?php
  if (isset($errormsg)) {
    echo "<p>", "Failed: ", $data["reason"], " : ", isset($data["message"]) ? $data["message"] : "", "</p></body></html>";
    exit;
  }
?>

  <table border="1">

    <tr>

      <td>Map Position</td>
      <td>Tag</td>
      <td>Name</td>
      <td>TH lvl</td>
      <td>Opponent Attacks</td>
      <td>Best Opponent Attack</td>

    </tr>

    <?php
      foreach ($members as $member) {
    ?>
        <tr>
          <td><?php echo $member["mapPosition"]; ?></td>
          <td><?php echo $member["tag"]; ?></td>
          <td><?php echo $member["name"]; ?></td>
          <td><?php echo $member["townhallLevel"]; ?></td>
          <td><?php echo $member["opponentAttacks"]; ?></td>
          <td><?php echo $member["bestOpponentAttack"]; ?></td>

        </tr>
    <?php
      }
    ?>

  </table>

</body>
</html>

地图位置
标签
名称
第四级
对手攻击
最佳对手攻击
像“标签”、“名称”、“地图位置”、“townhallLevel”、“OpponentTacks”这样的所有东西都显示得很好。当我添加“BestOpponentTack”时,我得到了以下错误:

“注意:第68行C:\xampp\htdocs\index.php中的未定义索引:BestOpponentTack”


我不知道我做错了什么,已经为此工作了几天,不知道为什么我的嵌套JSON返回为未定义。

好的,所以PHP中的所有数组都是可移植的;您完全可以foreach
bestopponentatck

php > var_dump($bestOpponentAttack);
array(5) {
  ["order"]=>
  int(1)
  ["attackerTag"]=>
  string(3) "abc"
  ["defenderTag"]=>
  string(3) "def"
  ["stars"]=>
  int(3)
  ["destructionPercentage"]=>
  int(100)
}
php > foreach ($bestOpponentAttack as $key=>$value){echo "{$key} : {$value}\n";}
order : 1
attackerTag : abc
defenderTag : def
stars : 3
destructionPercentage : 100
我想第一个问题是,您是否确定
bestopponentatck
始终存在于JSON中

如果是这样,下一个问题是
$members[0]['bestOpponentAttack']
是一个数组,您试图将其传递给
echo
,它只将字符串作为参数。但它提出了一个更大的问题,即您想要的信息在
$members[0]['bestOpponentAttack']
内部,而不是
$members[0]['bestOpponentAttack']
本身:

["members"]=>
    array(1) {
      [0]=>
      array(7) {
        ["tag"]=>
        string(6) "string"
        ["name"]=>
        string(6) "string"
        ["mapPosition"]=>
        int(0)
        ["townhallLevel"]=>
        int(0)
        ["opponentAttacks"]=>
        int(0)
        ["bestOpponentAttack"]=>
        array(5) {
          ["order"]=>
          int(0)
          ["attackerTag"]=>
          string(6) "string"
          ["defenderTag"]=>
          string(6) "string"
          ["stars"]=>
          int(0)
          ["destructionPercentage"]=>
          int(0)
        }...

您已将整个数组委托给单个表单元格,但需要决定如何在单元格中显示该数组的每一条信息,然后适当地访问每一条信息。如果需要,您可以遍历它,或者直接访问该单元格中所需的数据(例如,
$members[0]['bestOpponentAttack']['order']
)。

好吧,bestOpponentAttack将是一个assoc数组,您无法分别访问,但您会看到不同的错误。尝试echo print_r($member[“bestopponentatck”],true);而不是echo$member[“BestOpponentTack”];谢谢你的回复。这就是我的新产品线看起来的样子,没错,我想要BestOpponentTack中的产品。它并不总是存在,但它现在就存在,我正在尝试调用$data[“clan”][“members”][“bestOpponentAttack”][“destructionPercentage”]。我只是获取原始输出列表中每个下一个缩进嵌套的标题,但是当我进入[“BestOpponentTack”]时,它没有意识到它的存在。[“destructionPercentage”]是一个0到100的整数。下面是另一个例子,我得到了这个错误:“注意:未定义的索引:C:\xampp\htdocs\index.php中的bestopponentTack在第128行”并且第128行是“行尾指向一个整数,所以echo应该能够打印出来,对吗,我发誓最后一句话:3我发现我正在从BestOpponentTack跳到destructionpercentage,当时我需要调用介于这两者之间的正确数组。攻击的一个有效修复方法是将第128行更改为“”,而不是不带“[0]”。很高兴您能找到答案。该代码并不是针对您的问题的字面解决方案,只是基于答案中给出的示例
$members
数组的示例。此外,若不能保证JSON字段将出现,那个么在尝试对它们进行操作之前,最好先在代码中明确检查它们是否存在。是的,将它们视为数组,然后对JSON进行原始转储有助于将其分解。你说的最后一句话帮助最大,因为我不知道你可以用类似“[0]”的东西调用数组。
["members"]=>
    array(1) {
      [0]=>
      array(7) {
        ["tag"]=>
        string(6) "string"
        ["name"]=>
        string(6) "string"
        ["mapPosition"]=>
        int(0)
        ["townhallLevel"]=>
        int(0)
        ["opponentAttacks"]=>
        int(0)
        ["bestOpponentAttack"]=>
        array(5) {
          ["order"]=>
          int(0)
          ["attackerTag"]=>
          string(6) "string"
          ["defenderTag"]=>
          string(6) "string"
          ["stars"]=>
          int(0)
          ["destructionPercentage"]=>
          int(0)
        }...