无法将 JSON 解码为 PHP 数组并显示在 HTML 表中
Posted
技术标签:
【中文标题】无法将 JSON 解码为 PHP 数组并显示在 HTML 表中【英文标题】:Unable to decode JSON into PHP array and display in HTML table 【发布时间】:2016-06-08 09:21:23 【问题描述】:我有这个 json 数据
"next_offset": -1,
"records": [
"id": "87dad127-a60e-15a3-148e-56c7675f11df",
"name": "1A Unit",
"suite": "1A",
"sf": 1200,
"unit_floor": 1,
,
"id": "f386a7ad-d6ea-6eb1-9b8f-56cd6104c445",
"name": "3B Unit",
"suite": "3B",
"sf": 450,
"unit_floor": 3,
,
"id": "b352dc84-8c76-6c27-daa4-56cd61e71aa2",
"name": "3A Unit",
"suite": "3A",
"sf": 450,
"unit_floor": 3,
,
"id": "8ec4325a-1271-560e-888b-56cd6120f5de",
"name": "2B Unit",
"suite": "2B",
"sf": 450,
"unit_floor": 2,
,
"id": "5a15fd5e-246a-be4b-fd5d-56cd619e9ee1",
"name": "1B Unit",
"suite": "1B",
"sf": 450,
"unit_floor": 1,
,
"id": "61a55092-5683-1088-2d6c-56c99c5d4873",
"name": "2A Unit",
"suite": "2A",
"sf": 3000,
"unit_floor": 2,
]
我想根据楼层数在表格中显示此数据。就像 3 楼单位 3A、3B 及其一排的总面积(以平方英尺为单位)、2 楼单位 2A、2B 及其一排的面积总和以及一楼的单位 1A、1B 及其一排的面积总和。请帮帮我。
我试过了,但它没有给出预期的结果
$unit_response = call($url, $oauth2_token_response->access_token, 'GET');
$unit_json = json_decode(json_encode($unit_response),true);
<table class="stak-plan">
<?php foreach ($unit_json['records'] as $unit_data) ?>
<tr>
<td>Floor: 3</td>
<td>
Suit : <?php echo $unit_data['name'] ?><br>
SF : <?php echo $unit_data['sf'] ?>
</td>
<td>Suite: 3B<br /> SF: 25,000</td>
<td>Suite: 3C<br /> SF: 25,000</td>
<td>
</td>
</tr>
<?php ?>
</table>
这是预期的输出,。
【问题讨论】:
你到底在纠结什么? 你有没有尝试过?你试过的代码在哪里?你想让我们为你做这件事吗? 感谢您提供您的代码。 json_decode 声明在哪里?我们需要查看您从哪里获取数据以及如何将其拉入 json_decode 以了解您在做什么。 你试过我的答案了吗?我会说它是最准确的答案,所需的代码最短。让我知道它是否有效,我只是好奇。 【参考方案1】:CSS:
<style>
td
border: 1px solid black;
padding: 15px;
</style>
JSON(一些多余的逗号已被删除):
$json = '
"next_offset": -1,
"records": [
"id": "87dad127-a60e-15a3-148e-56c7675f11df",
"name": "1A Unit",
"suite": "1A",
"sf": 1200,
"unit_floor": 1
,
"id": "f386a7ad-d6ea-6eb1-9b8f-56cd6104c445",
"name": "3B Unit",
"suite": "3B",
"sf": 450,
"unit_floor": 3
,
"id": "b352dc84-8c76-6c27-daa4-56cd61e71aa2",
"name": "3A Unit",
"suite": "3A",
"sf": 450,
"unit_floor": 3
,
"id": "8ec4325a-1271-560e-888b-56cd6120f5de",
"name": "2B Unit",
"suite": "2B",
"sf": 450,
"unit_floor": 2
,
"id": "5a15fd5e-246a-be4b-fd5d-56cd619e9ee1",
"name": "1B Unit",
"suite": "1B",
"sf": 450,
"unit_floor": 1
,
"id": "61a55092-5683-1088-2d6c-56c99c5d4873",
"name": "2A Unit",
"suite": "2A",
"sf": 3000,
"unit_floor": 2
]
';
PHP:
$jd = json_decode($json);
$floors = array();
foreach ($jd->records AS $key => $obj)
$f = $obj->unit_floor;
$id = $obj->id;
$name = $obj->name;
$suite = $obj->suite;
$sf = $obj->sf;
$floors[$f][$suite]['name'] = $name;
$floors[$f][$suite]['id'] = $id;
$floors[$f][$suite]['sf'] = $sf;
//sort floors in desc order
krsort($floors);
foreach($floors as $id => $floor)
ksort($floors[$id]);
print '<table>';
foreach($floors as $floor => $suites)
$sqf = 0;
print '<tr>';
print '<td>FLOOR: '.$floor.'</td>';
foreach($suites AS $suite => $value)
$sqf += $value['sf'];
print '<td>Suite: '.$suite.'<br>SF: '.$value['sf'].'</td>';
print '<td>'.$sqf.'</td>';
print '</tr>';
print '</table>';
输出:
【讨论】:
谢谢@mitkosoft,它作为一个单独的文件工作。但是我通过 REST 调用获得的 json 完全不同,当我尝试将此 ccode 与该 json 集成时,我收到一个错误,例如“array_flip() 期望参数 1 是数组”、“尝试获取非对象”等等,。 只给我们真正的 JSON 响应就足够了,而不是为了给你正确的解决方案的示例。 这是我真正的问题。请看看你是否能解决这个问题,。我已经提到了 mt 测试环境的所有 URL 和有效凭据。请帮我。 link. 你有我的分析器。【参考方案2】:这是获得解决方案的另一种方法:
<?php
$json = '
"next_offset": -1,
"records": [
"id": "87dad127-a60e-15a3-148e-56c7675f11df",
"name": "1A Unit",
"suite": "1A",
"sf": 1200,
"unit_floor": 1
,
"id": "f386a7ad-d6ea-6eb1-9b8f-56cd6104c445",
"name": "3B Unit",
"suite": "3B",
"sf": 450,
"unit_floor": 3
,
"id": "b352dc84-8c76-6c27-daa4-56cd61e71aa2",
"name": "3A Unit",
"suite": "3A",
"sf": 450,
"unit_floor": 3
,
"id": "8ec4325a-1271-560e-888b-56cd6120f5de",
"name": "2B Unit",
"suite": "2B",
"sf": 450,
"unit_floor": 2
,
"id": "5a15fd5e-246a-be4b-fd5d-56cd619e9ee1",
"name": "1B Unit",
"suite": "1B",
"sf": 450,
"unit_floor": 1
,
"id": "61a55092-5683-1088-2d6c-56c99c5d4873",
"name": "2A Unit",
"suite": "2A",
"sf": 3000,
"unit_floor": 2
]
';
解析数据的函数:
function createArray($unit_json)
$max_unit_floor = 0;
$subcells=array_map(function($n)use(&$max_unit_floor)
if((int)$max_unit_floor < (int)$n->unit_floor) $max_unit_floor = $n->unit_floor;
return preg_replace('/\d*/','',$n->suite);
,$unit_json->records);
$subcells = array_flip(array_flip($subcells));
$cells = array();
for($i = $max_unit_floor; $i > 0; $i--)
$values = array();
foreach($subcells as $v)
$values[] = $i.$v;
$cells['floor_'.$i] = array('title'=>'Floor: '.$i,'values'=>$values,"total"=>0);
foreach ($unit_json->records as $unit_data)
foreach ($cells as $key=>$value)
for($i=0;$i<count($value['values']);$i++)
if($value['values'][$i]==$unit_data->suite)
$cells[$key][$value['values'][$i]] = array("sf"=>$unit_data->sf);
$cells[$key]["total"] += (float)$unit_data->sf;
return $cells;
?>
html表格:
<table class="stak-plan" border="1" cellpadding="4" cellspacing="0">
<?php
$unit_json = json_decode($json);
$cells = createArray($unit_json);
foreach ($cells as $key=>$value)
?>
<tr>
<td><?php echo $value['title']?></td>
<?php foreach($value['values'] as $k=>$cell) ?>
<td>Suite: <?php echo $cell?><br /> SF: <?php echo isset($cells[$key][$cell]['sf'])?$cells[$key][$cell]['sf']:''; ?></td>
<?php ?>
<td>sum: <?php echo $cells[$key]["total"]; ?></td>
</tr>
<?php ?>
</table>
回复:
【讨论】:
这可行,但它不是动态的,因为您必须手动定义$cells
@CodeGodie,我修好了。
谢谢@miglio,它作为一个单独的文件工作。但是我通过 REST 调用获得的 json 完全不同,当我尝试将此 ccode 与该 json 集成时,我收到一个错误,例如“array_flip() 期望参数 1 是数组”、“尝试获取非object " "为 foreach() 提供的参数无效" 等等,。
@hemanthkumar 你试过我的答案了吗?我确信它会起作用。【参考方案3】:
问题似乎是您的 JSON 格式。你有 "trailing commas" 这将阻止它被正确解码,因此在你的 foreach
循环中得到空结果。你有两个选择:
修复您的 JSON 并删除尾随逗号
"next_offset": -1,
"records": [
"id": "87dad127-a60e-15a3-148e-56c7675f11df",
"name": "1A Unit",
"suite": "1A",
"sf": 1200,
"unit_floor": 1, // <-- TRAILING COMMA
]
使用函数 (source) 在运行 json_decode
之前自动删除这些逗号:
function removeTrailingCommas($json)
$json = preg_replace('/,\s*([\]])/m', '$1', $json);
return $json;
$json = ''; // <-- your ogiginal JSON string
$json = removeTrailingCommas($json);
$unit_json = json_decode($json, 1);
一旦你这样做了,你就可以用这种方式迭代来创建你的表:
$floors = array();
foreach ($unit_json['records'] as $record)
$floors[$record['unit_floor']][$record['suite']] = $record;
krsort($floors);
?>
<table class="stak-plan">
<?php foreach ($floors as $floor_num => $floor_units) ?>
<tr>
<td>Floor: <?= $floor_num ?></td>
<?php
ksort($floor_units);
foreach ($floor_units as $unit)
?>
<td>
Suite : <?= $unit['suite'] ?><br>
SF : <?= $unit['sf'] ?>
</td>
<?php
?>
<td>
<?php
echo array_sum(array_map(function ($item)
return $item['sf'];
, $floor_units));
?>
</td>
</tr>
<?php ?>
</table>
【讨论】:
投反对票的人能否解释为什么投反对票?也许你可以教我一些我错过的东西。谢谢。【参考方案4】:为了在 PHP 中实现这一点,使用 read() 从某处加载文件,然后在其内容中执行 json_decode()
,有效地创建一个数组,然后使用 foreach
循环遍历每个,使用模板显示价值。 还记得传递第二个参数,因为它创建的是关联数组而不是对象。
$contents = //open file from fs or wherever you want to get it (curl, etc)
$array = json_decode($contents, 1); //argument for assoc array
foreach ($array as $key => $value)
// echo your table...
这是一个关于如何做的粗略想法,但应该能让你上路。
一个更完整的想法是,例如,
<table>
<?php foreach ($array as $key => $val): ?>
<!-- your table arrangement in html -->
<?= $key ?>
<?php // do whatever you want here with the array... ?>
<?= $value ?>
<?php endforeach; ?>
</table>
编辑:我看到了你的错误,你将一个键传递给一个 foreach 循环,但 foreach 循环将数组作为输入,除非数组在键内。如果是这样,我需要看看你在哪里解码以及你在哪里转储它。
在此处阅读有关 json_decode 的更多信息: http://php.net/manual/en/function.json-decode.php
下面是一个实际论证的例子: https://eval.in/525451
【讨论】:
我同意这个答案,但是 OP(原始海报)应该提供一些他/她在提供任何答案之前尝试过的代码。 他们现在更新了他们的问题并提供了代码。不错。 更新:如果投反对票,请解释原因。它在规则中。【参考方案5】:$json_string = "your json string like above";
//or you can $json_string = file_get_contents(url_return_your_json);
然后,您使用json_decode
将其转换为数组
$your_array = json_decode($json_string,1);
【讨论】:
@CodeGodie:他们是一大堆代码,比如数百行。所以我只添加了必需的代码。抱歉,如果不清楚。 @hemanthkumar 没问题。只需确保包含与问题相关的任何区域,以便我们可以更好地解决问题。无论如何,就像我在上面的评论中所说的那样,问题在于 JSON 的格式。以上是关于无法将 JSON 解码为 PHP 数组并显示在 HTML 表中的主要内容,如果未能解决你的问题,请参考以下文章