我如何使用foreach调用api的每个部分


How do I call every piece of the api using foreach?

我有一个问题,我想我单独尝试后问这里。我一直在努力从我必须使用的api调用几个数组。我正在尝试使用foreach,但当前代码仅显示api中的最后一个对象。

PHP:

$json_array = json_decode(file_get_contents('https://api.ark.bar/v1/server/209.170.149.98/16753'), true);
$name = $json_array['server']['name'];
$version = $json_array['server']['version'];
$map = $json_array['server']['map'];
$time = $json_array['server']['time'];
$playercount = $json_array['server']['playerCount'];
$maxplayers = $json_array['server']['playerMax'];
$secure =  $json_array['server']['secure'];
foreach($json_array['server']['players'] as $info) {
    $playerName = $info['name'];
    $playerScore = $info['score'];
    $playerTime = $info['time'];
    $playerHumanTime = $info['humanTime'];
}
if($json_array['secure'] = true) {
    $secureTrue = "Yes";
} else {
    $secureTrue = "No";
}
if($json_array['status'] != NULL) {
    echo "<h2>Name: $name</h2><p>Version: $version</p><p>Map: $map</p><p>Time: $time</p><p>Player Count: $playercount</p><p>Max Players: $maxplayers</p><p>Secure: $secureTrue</p>";
    echo "<h2>Players</h2><p>$playerName</p><p>$playerScore</p><p>$playerTime</p><p>$playerHumanTime</p>";
} else {
    echo "<p>Server is Offline</p>";    
}
JSON:

{
    "status": true,
    "server": {
        "name": "Server Name",
        "version": 216.2,
        "map": "TheIsland",
        "time": "07:12",
        "port": 16743,
        "game": "ARK: Survival Evolved",
        "environment": "Windows",
        "secure": true,
        "playerCount": 3,
        "playerMax": 60,
        "players": [
            {
                "name": "=[A51]=Sarge",
                "score": 0,
                "time": 20520.654296875,
                "humanTime": "5 hours, 42 minutes"
            },
            {
                "name": "Tureman",
                "score": 0,
                "time": 15358.5849609375,
                "humanTime": "4 hours, 16 minutes"
            },
            {
                "name": "Borgscan",
                "score": 0,
                "time": 12156.5673828125,
                "humanTime": "3 hours, 23 minutes"
            }
        ]
    }
}

最终结果是信息被传递到页面,但玩家信息完全被忽略,除了最后一个玩家。我已经搜索了如何在foreach中标记它们,但我无法得到最终结果。(

foreach 的每次迭代都会覆盖上一个。

一旦$info获得一个新的数组实例化,每个接收到它的字段的变量都被重新分配新的字段值。

由于输出在循环之外,它只会写出最后赋给变量的值。

你必须把你的echo s放在你的foreach中,而不是把它们分配给新的变量。

按照代码的逻辑,它应该是这样的:
if($json_array['status'] != NULL)
{
    echo "<h2>Name: $name</h2><p>Version: $version</p><p>Map: $map</p><p>Time: $time</p><p>Player Count: $playercount</p><p>Max Players: $maxplayers</p><p>Secure: $secureTrue</p>";
    foreach($json_array['server']['players'] as $info)
        echo "<h2>Players</h2><p>$info['name'];</p><p>$info['score'];</p><p>$info['time'];</p><p>$info['humanTime'];</p>";
}

注意代码缩进以提高可读性

你可能想把players分配给array,并循环输出,否则,你只会得到最后一个玩家,即:

<?php
$json_array = json_decode(file_get_contents('https://api.ark.bar/v1/server/209.170.149.98/16753'), true);
$name = $json_array['server']['name'];
$version = $json_array['server']['version'];
$map = $json_array['server']['map'];
$time = $json_array['server']['time'];
$playercount = $json_array['server']['playerCount'];
$maxplayers = $json_array['server']['playerMax'];
$secure =  $json_array['server']['secure'];
foreach($json_array['server']['players'] as $info)
{
    $playerName[] .= $info['name'];
    $playerScore[] .= $info['score'];
    $playerTime[] .= $info['time'];
    $playerHumanTime[] .= $info['humanTime'];
}
if($json_array['secure'] = true) {
    $secureTrue = "Yes";
} else {
    $secureTrue = "No";
}
if($json_array['status'] != NULL) {
     echo "<h2>Name: $name</h2><p>Version: $version</p><p>Map: $map</p><p>Time: $time</p><p>Player Count: $playercount</p><p>Max Players: $maxplayers</p><p>Secure: $secureTrue</p>";
     for($i=1; $i < count($playerName); $i++){
         echo "<h2>Players</h2><p>{$playerName[$i]}</p><p>{$playerScore[$i]}</p><p>{$playerTime[$i]}</p><p>{$playerHumanTime[$i]}</p>";
     }
 } else {
     echo "<p>Server is Offline</p>";    
 }
?>

我已经测试了代码,它可以正常工作。

每次循环并重新分配变量,因此只有最后一个将分配给您拥有的变量。试着

foreach($json_array['server']['players'] as $info)
                {
                $playerName = $info['name'];
                $playerScore = $info['score'];
                $playerTime = $info['time'];
                $playerHumanTime = $info['humanTime'];
                if($json_array['secure'] = true) {
                   $secureTrue = "Yes";
                } else {
                   $secureTrue = "No";
                }
                if($json_array['status'] != NULL) {
                   echo "<h2>Name: $name</h2><p>Version: $version</p><p>Map: $map</p><p>Time: $time</p><p>Player Count: $playercount</p><p>Max Players: $maxplayers</p><p>Secure: $secureTrue</p>";
                   echo "<h2>Players</h2><p>$playerName</p><p>$playerScore</p><p>$playerTime</p><p>$playerHumanTime</p>";
                } else {
                  echo "<p>Server is Offline</p>";    
                }
                }

您的代码正在重写一个变量,然后在循环完成后打印它。将输出代码移到循环中。我个人主张将文本字符串赋值给变量,然后在循环结束后输出(这样更快)。

$json_array = json_decode(file_get_contents('https://api.ark.bar/v1/server/209.170.149.98/16753'), true);
$name = $json_array['server']['name'];
$version = $json_array['server']['version'];
$map = $json_array['server']['map'];
$time = $json_array['server']['time'];
$playercount = $json_array['server']['playerCount'];
$maxplayers = $json_array['server']['playerMax'];
$secure =  $json_array['server']['secure'];
$output = "<h2>Name: $name</h2><p>Version: $version</p><p>Map: $map</p><p>Time: $time</p><p>Player Count: $playercount</p><p>Max Players: $maxplayers</p><p>Secure: $secureTrue</p>";
foreach($json_array['server']['players'] as $info) {
    $playerName = $info['name'];
    $playerScore = $info['score'];
    $playerTime = $info['time'];
    $playerHumanTime = $info['humanTime'];
    $output.= "<h2>Players</h2><p>$playerName</p><p>$playerScore</p><p>$playerTime</p><p>$playerHumanTime</p>";
}
if($json_array['secure'] = true) {
    $secureTrue = "Yes";
    echo $output;
} else {
    $secureTrue = "No";
}
if($json_array['status'] != NULL) {
    echo $output;
} else {
    echo "<p>Server is Offline</p>";    
}

像这样修改你的代码

if($json_array['status'] != NULL) {
    echo "<h2>Name: $name</h2><p>Version: $version</p><p>Map: $map</p><p>Time: $time</p><p>Player Count: $playercount</p><p>Max Players: $maxplayers</p><p>Secure: $secureTrue</p>";
    echo "<h2>Players</h2>";
    $playerNum=1;
    foreach($json_array['server']['players'] as $info) {
        $playerName = $info['name'];
        $playerScore = $info['score'];
        $playerTime = $info['time'];
        $playerHumanTime = $info['humanTime'];
        echo "<h3>Player $playerNum</h3><p>$playerName</p><p>$playerScore</p><p>$playerTime</p><p>$playerHumanTime</p>";
        $playerNum++;
}