【问题标题】:Append php loop data to JSON object将 php 循环数据附加到 JSON 对象
【发布时间】:2019-07-06 13:13:51
【问题描述】:

我需要一个 html 模板中的循环 php 数据,所以我知道它与 JSON 有关,但不是 JSON 专家,在搜索网络时找不到太多帮助。

$uniqueFranchise_id = array_unique($franchise_id);
$dataArr = '[
    {
        "name": "Dylan",
        "page_link": "https://mypage.com/"
    }
   ]';
foreach($uniqueFranchise_id as $franchise)
{
    $sqlFranchise = "select * from franchise where franchise_id = $franchise";
    $resultFranchise = $conn->query($sqlFranchise);
    if($resultFranchise->num_rows > 0)
    {
        while($rowFranchise = $resultFranchise->fetch_assoc())
        {
           $dataArr = json_decode($data, TRUE);
           $dataArr[] = "['name'=>'".$rowFranchise['name']."', 'page_link'=>'".$rowFranchise['page_link']."']";
           //$json = json_encode($dataArr);
        }
    }
}

$json = json_encode($dataArr);
print_r($dataArr);

但它只追加一行。事实上,它删除了我的 dataArr 中已经存在的数据,只是从我的循环中添加了一行?也许我完全错误地处理这种情况?

【问题讨论】:

  • 你的第一个 $dataArr 不是一个数组,它只是一个具有数组表示的字符串。在您的 while 循环中,添加 $dataArr .= json_decode($data, TRUE);这会将其附加到您的原始 $dataArr
  • 好的,所以我需要将第一个作为关联数组?
  • 实际上,我什至认为您不需要在 while 循环中执行 json_decode。由于 $dataArr 已经是一个字符串,而 json_decode 是从一个字符串转换的,我猜 $data 已经是一个字符串,只需将 $data 附加到 $dataArr 看看它会给你什么。

标签: php json loops append


【解决方案1】:

您将 $dataArr 设置在 while 循环内。所以每次循环运行时,都会被覆盖。此外,当您将其作为数组(或对象)处理并随后将其转换为 JSON 时,它更有意义并且更清晰。

$dataArr = array(array('name' => 'Dylan', 'page_link' => 'https://mypage.com/'));

foreach($uniqueFranchise_id as $franchise)
{
    $sqlFranchise = "select * from franchise where franchise_id = $franchise";
    $resultFranchise = $conn->query($sqlFranchise);
    if($resultFranchise->num_rows > 0)
    {
        while($rowFranchise = $resultFranchise->fetch_assoc())
        {
           $dataArr[] = array('name' => $rowFranchise['name'], 'page_link' => $rowFranchise['page_link']);
        }
    }
}

$json = json_encode($dataArr);
echo $json;

【讨论】:

  • 这成功了!谢谢你。一个问题。我只是觉得。我正在打印 $dataArr 而不是 $json。我刚刚意识到这可能是一个错误,但是当我这样运行它时,它运行良好。 $json 变量的意义何在?
  • 我没有注意到这一点。我刚刚更新了代码,所以它显示了 json 输出。
  • 知道为什么会出现这样的结果:{"name":"Dylan","page_link":"https:\/\/mypage.com\/"} 为什么会有反斜杠页面链接?
  • 这是一种转义某些字符以避免破坏 JSON 结构的方法。不用担心,运行 json_decode() 时,那些转义字符会消失。
  • 知道了。谢谢!
【解决方案2】:

您不应该自己构建字符串,您应该构建数据然后对结果进行 JSON 编码(代码中的 cmets)...

$dataArr = '[
    {
        "name": "Dylan",
        "page_link": "https://mypage.com/"
    }
   ]';
// decode existing JSON to start array
$dataArr = json_decode($data, TRUE);
foreach($uniqueFranchise_id as $franchise)
{
    // Read just the data you need from the table
    $sqlFranchise = "select name, page_link from franchise where franchise_id = $franchise";
    $resultFranchise = $conn->query($sqlFranchise);
    if($resultFranchise->num_rows > 0)
    {
        // Read all of the rows into an array
        $newData = $resultFranchise->fetch_all(MYSQLI_ASSOC);
        // Add in existing data
        $dataArr = array_merge($dataArr, $newData);
    }
}

// Now encode the list of elements into 1 string
echo json_encode($dataArr);

如果不信任此数据以阻止 SQL 注入,您还应该查看准备好的语句。

【讨论】:

  • 谢谢,刚刚给别人答案,但我会调查一下。是的,我知道准备好的陈述。不在这里做,因为它是对用户隐藏的所有数据。如果用户在文本字段中输入数据,您应该只使用准备好的?
  • 即使是表单上的隐藏字段也可以更改 - 不要相信任何人。有些人会建议始终使用准备好的语句,因为它会让你养成这样做的习惯,但我认为你必须就何时应该使用它们做出明智的决定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
相关资源
最近更新 更多