无法将 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 表中的主要内容,如果未能解决你的问题,请参考以下文章

将图像数组转换为 JSON 文件并在 C# 之后对其进行解码

来自localstorage的JSON无法在php中解码

如何解码 json 对象数组

在 PHP 代码中嵌入 HTML

如何将 json 字符串解码为 UTF-8?

为啥我不能在 Swift 中解码我的 JSON 文件?