我有一个问题,我想我单独尝试后问这里。我一直在努力从我必须使用的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++;
}