你好,我正在尝试将json文件打印到表中。 json文件来自此网站https://jsonvat.com/。我要打印$data->rates->periods->rates[0]->standard
。但是我得到
“不能将stdClass类型的对象用作...中的数组”
我的代码是这样的:
$data = json_decode($response);
echo '<table class="table"><thead><tr><th scope="col">Country</th><th scope="col">First</th><th scope="col">Last</th><th scope="col">Handle</th></tr></thead><tbody>';
foreach($data->rates as $rate){
echo '<tr><th scope="row">'.$rate->name.'</th>';
foreach($rate->periods as $period){
echo '<td>'.$period->rates->standard.'</td><td>'.$period->rates->redused.'</td><td>'.$period->rates->super_reduced.'</td></tr>';
}
}
echo '</tbody></table>';
当我将$data = json_decode($response);
更改为$data = json_decode($response, true);
并且代码变为
foreach($data as $rate){
echo '<tr><th scope="row">'.$rate['name'].'</th>';
我说一个错误
警告:非法字符串偏移“名称”位于 C:\ xampp \ htdocs \ wordpress \ wp-content \ plugins \ test-plug \ functions.php 在第23行。
谢谢。
答案 0 :(得分:1)
您需要按以下方式更改代码:
$json = file_get_contents("https://jsonvat.com/");
$dataObject = json_decode($json, true);
echo '<table class="table"><thead><tr><th scope="col">Country</th><th scope="col">First</th><th scope="col">Last</th><th scope="col">Handle</th></tr></thead><tbody>';
foreach($dataObject['rates'] as $rate){
echo '<tr><th scope="row">'.$rate['name'].'</th>';
foreach($rate['periods'] as $period){
echo '<td>'.$period['rates']['standard'].'</td><td>'.$period['rates']['reduced'].'</td><td>'.$period['rates']['super_reduced'].'</td></tr>';
}
}
echo '</tbody></table>';
在这里,我发现Rate键中有时不存在reduce键或super_reduced键。因此您需要相应地更改代码。希望对您有帮助。
答案 1 :(得分:0)
var express = require('express');
var app = express();
var ExpressPeerServer = require('peer').ExpressPeerServer;
var ip = require('ip');
var fs = require('fs');
app.use(express.static(__dirname + '/public'));
var options = {
debug: true
}
var sslOptions = {
key: fs.readFileSync('ssl/key.pem', 'utf8'),
cert: fs.readFileSync('ssl/cert.pem', 'utf8')
};
var server = require('https').createServer(sslOptions,app);
var peerserver = ExpressPeerServer(server, options);
app.use('/scripts', express.static(`${__dirname}/node_modules/`));
app.use(express.static('public'));
app.get('/sender', function (req, res, next) {
// res.render('sender.html');
// res.header("Access-Control-Allow-Origin", "*");
// res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.sendFile(__dirname + '/public/sender.html');
});
app.get('/recived', function (req, res, next) {
// res.render('sender.html');
// res.header("Access-Control-Allow-Origin", "*");
// res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.sendFile(__dirname + '/public/recived.html');
});
app.use('/', peerserver);
server.listen(9000,ip.address(),()=>{
console.log(`server peer on ${ip.address()}:9000`);
});
或者您可以使用.split()
答案 2 :(得分:0)
您尝试访问的各种元素(包括打字机)有一些问题。并非所有元素都具有减少的(未“重用”)值,有些元素的确具有减少的1(和减少的2)值或根本没有,与super_reduced相同。在代码中,如果未找到任何值,则使用空合并(??)设置默认值。您可能需要调整这些内容,以显示您认为最没有价值的东西...
echo '<td>'.$period->rates->standard.'</td><td>'.
($period->rates->reduced??$period->rates->reduced1??'Non').
'</td><td>'.($period->rates->super_reduced??'Non').'</td></tr>';
答案 3 :(得分:0)
您可以通过简单的foreach()
循环访问值,并根据需要在<tr>
元素上进行设置
$array = json_decode($json,1);
foreach($array['rates'] as $k=>$v){
echo $v['periods'][0]['rates']['standard'].PHP_EOL;
}
答案 4 :(得分:0)
您误解了json_decode的第二个参数:文档提示:
为TRUE时,返回的对象将转换为关联数组。
因此,在应该使用$data->rates
访问费率之前,现在应该使用$data['rates']
(与$rate->periods
相同,即变成$rate['periods']
)。
因此,您应该看起来像(未经测试)
foreach($data['rates'] as $rate) {
echo '<tr><th scope="row">'.$rate['name'].'</th>';
}
答案 5 :(得分:0)
当解码为对象时,嵌套为$data->rates[0]->periods[0]->rates->standard
,其中第一个rates
和periods
是数组。只需将它们都循环:
foreach($data->rates as $rates) {
foreach($rates->periods as $period) {
echo $period->rates->standard . "<br />\n";
echo $period->rates->reduced. "<br />\n";
echo $period->rates->super_reduced . "<br />\n";
}
}
如果某些属性不能保证存在,请检查isset
。
答案 6 :(得分:0)
尝试此操作可以为您提供帮助,或者您可以在功能上使用此功能
<?php
$count = 0;
$limit = 50;
foreach($data['rates'] as $rate) {
//count times export data
$count++;//first = 0
if($count == $limit)
break;//if limit == count stop
//export data
echo $rate['name'];
}
?>