【问题标题】:json_decode of array not rendering correctly in HTML output数组的 json_decode 在 HTML 输出中未正确呈现
【发布时间】:2015-02-18 12:35:00
【问题描述】:

我有一个数据库,其中包含一些以 json 格式编码的数据。我想输出一个 HTML 表,但是当 json 编码数据单元格中的特定数据是一个数组时,我遇到了障碍。 HTML 表中的字段会输出单词“Array”以及“注意:数组到字符串的转换...”。

我的代码使用 MySQL 语句来检索数据和通常的 fetch 数组运算符。用于渲染json编码数据的具体代码为:

$user_params = json_decode($row['params'], true);

并创建输出:

<td>{$user_params['phone']}</td>
<td>{$user_params['ride_catagory']}</td>

上面的第一行正确呈现,因为数据被编码为单个文本字符串,但是,第二行给了我“数组”和消息,因为它被编码为 json 数据中的数组。我该如何解决这个问题?

这是“params”数据库字段的内容:

{"phone":"444-336-5678","birth_year":"1965","volunteer":[""],"ride_catagory":["10-12","13-15","16 plus"],"ride_note":"on","membership_visible":"on"}

【问题讨论】:

  • var_dump($user_params) 输出什么?
  • 因此 $user_params['ride_catagory'] 很可能不是一个单一的值,而是一个数组,您必须添加另一个级别才能访问它的特定部分。 $user_params['ride_catagory']['something']...

标签: php mysql arrays json


【解决方案1】:

你可以用不同的方式管理这件事。 你实际的方法是依赖于已经知道你得到的array 的键,所以我想你也可以假设你知道其中的内容类型。 如果您知道类型,那么当您知道元素的内容也是array 时,您可以执行特定的行为

<?php
$row = array(
    'params' => '{"phone":"444-336-5678","birth_year":"1965","volunteer":[""],"ride_catagory":["10-12","13-15","16 plus"],"ride_note":"on","membership_visible":"on"}'
);
$user_params = json_decode($row['params'], true);
?>

然后是类似的东西(以相当盲目的方式):

<td><?= $user_params['phone']; ?></td>
<td><?= implode($user_params['ride_catagory'],', '); ?></td>

或喜欢(概念上更好):

<td><?= $user_params['phone']; ?></td>
<td>
    <?php
        if(is_array($user_params['ride_catagory'])) {
            echo '<table><tr>'.PHP_EOL;
            foreach ($user_params['ride_catagory'] as $category) {
                echo sprintf('<td>%s</td>'.PHP_EOL, $category);
            }
            echo '</tr></table>';
        } else {
            echo $user_params['ride_catagory'];
        }
    ?>
</td>

这完全取决于您您希望代码有多灵活(即使您不知道数组元素将包含什么类型的数据也可以工作)。

注意

我要补充一点,如果你没有验证它们,你不应该直接将值打印到输出中(否则你会让自己暴露在 XSS 攻击 .

【讨论】:

  • 我在使用任一代码时都遇到语法错误,这可能是因为我的 HTML 列标记作为元素的一部分出现在较大的变量 = 语句中,即 $arr = ...
    {$user_params['ride_catagory']}
    ;我尝试将 implode 语句分配给变量 $cat,然后使用
    {$cat} ,但是,我收到警告“implode(): Invalid arguments pass in...”。跨度>
  • @user3520372 您应该检查所有&lt;?php/?&gt; 开始和结束标记,并确保所有 HTML 都在 HTML 位置,并且 PHP 包含在上述标记中。我还修复了代码。关于 "implode(): Invalid arguments passed in..." 警告,您应该检查并确保作为参数传递给 implode() 的值是 array 类型的;否则该功能将不起作用。
【解决方案2】:

尝试加入价值观

<td>{$user_params['phone']}</td>
<td>{implode($user_params['ride_catagory'],',')}</td>

【讨论】:

    猜你喜欢
    • 2021-02-25
    • 2012-03-05
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2016-12-14
    相关资源
    最近更新 更多