使用 while 循环对多维数组进行编码
Posted
技术标签:
【中文标题】使用 while 循环对多维数组进行编码【英文标题】:Encode multidimensional array using while loop 【发布时间】:2021-12-13 12:13:44 【问题描述】:我有一个多维数组,我希望使用 php 像这样打印它,但是没有逗号分隔大括号 ,它应该像
,
。你们能帮帮我吗?
"user_activity": [
"log_number": "1",
"log_user_1": "w120511891",
"log_activity_id": "A0002DOC",
"log_user_2": "",
"log_document_id": "DSX00012",
"log_material_id": "",
"log_timestamp": "2021-10-23 13:52:35",
"log_rand_key": "127",
"log_hash_key": "09c7e3bb5d6f74c257aa4b4cdae388a69177c7dc",
"log_project_id": "1520002",
"log_number_reference": "",
"log_close": "1"
"log_number": "9",
"log_user_1": "W201005911",
"log_activity_id": "A0004DOC",
"log_user_2": "",
"log_document_id": "DSX00012",
"log_material_id": "",
"log_timestamp": "2021-10-25 10:35:29",
"log_rand_key": "127",
"log_hash_key": "d04e8d1ef5c9f8b85a3f7556b92d6a7fcdc11639",
"log_project_id": "1520002",
"log_number_reference": "1",
"log_close": "1"
]
这是我的 PHP 代码
echo "\"user_activity\": [";
while($rsel_userAct_p = mysqli_fetch_array($xsel_userAct_p, MYSQLI_ASSOC))
print_r(json_encode($rsel_userAct_p), JSON_PRETTY_PRINT);
echo "]";
【问题讨论】:
json_encode
在循环中几乎不是一个好主意。您想要的是构造一个有效的数据结构(array
、stdClass
或实现JsonSerializable
的东西),并且只在该结构上调用json_encode
一次。
除了 print_r
不是在这里开始使用的正确函数之外,你为什么要传递 JSON_PRETTY_PRINT
作为它的第二个参数...
【参考方案1】:
你做错了。只需创建一个数组,将 MySQL 中的数据附加到其中并 json_encode
数组本身:
$array = [];
while ($rsel_userAct_p = mysqli_fetch_array($xsel_userAct_p, MYSQLI_ASSOC))
$array["user_activity"][] = $rsel_userAct_p;
echo json_encode($array, JSON_PRETTY_PRINT);
甚至更好:
$array = [
"user_activity" => mysqli_fetch_all($xsel_userAct_p, MYSQLI_ASSOC)
];
echo json_encode($array, JSON_PRETTY_PRINT);
【讨论】:
【参考方案2】:您的问题是您首先使用的是 print_r。 print_r 旨在打印出一种非常特殊的格式,它有助于数组结构,但与 json 无关。
取自print_r documentation
<pre>
<?php
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x', 'y', 'z'));
print_r ($a);
?>
</pre>
将导致
大批 ( [a] => 苹果 [b] => 香蕉 [c] => 数组 ( [0] => x 1 => 是 [2] => z ) )您真正想要的(至少从您的代码示例中猜测)是您想要打印出一个 json 对象,该对象由您的数据库中的多个结果组成,基于您之前获得的数组结果。
因此,您首先创建一个适当的数组结构,然后然后使用给定的 json 函数将其打印出来,而不是使用您当前的代码。
$activities = [
'user_activity' => []
];
while($rsel_userAct_p = mysqli_fetch_array($xsel_userAct_p, MYSQLI_ASSOC))
$activities['user_activity'][] = $rsel_userAct_p;
echo json_encode($activities, JSON_PRETTY_PRINT);
实际结果应该与您想要的结果完全一样,并且无论数据库中的条目数量如何都可以正常工作。
【讨论】:
【参考方案3】:这将使您的 JSON 格式正确:
$json='"user_activity": [
"log_number": "1",
"log_user_1": "w120511891",
"log_activity_id": "A0002DOC",
"log_user_2": "",
"log_document_id": "DSX00012",
"log_material_id": "",
"log_timestamp": "2021-10-23 13:52:35",
"log_rand_key": "127",
"log_hash_key": "09c7e3bb5d6f74c257aa4b4cdae388a69177c7dc",
"log_project_id": "1520002",
"log_number_reference": "",
"log_close": "1"
"log_number": "9",
"log_user_1": "W201005911",
"log_activity_id": "A0004DOC",
"log_user_2": "",
"log_document_id": "DSX00012",
"log_material_id": "",
"log_timestamp": "2021-10-25 10:35:29",
"log_rand_key": "127",
"log_hash_key": "d04e8d1ef5c9f8b85a3f7556b92d6a7fcdc11639",
"log_project_id": "1520002",
"log_number_reference": "1",
"log_close": "1"
]';
$json=str_replace("",",",$json);
然后你可以使用:
echo "<pre>";
print_R(json_decode($json,true));
将 JSON 转换为 PHP 数组。
你可以在while中使用:
$json = [];
while ($rsel_userAct_p = mysqli_fetch_array($xsel_userAct_p, MYSQLI_ASSOC))
$json["user_activity"][] = $rsel_userAct_p;
echo json_encode($json, JSON_PRETTY_PRINT);
【讨论】:
如何在PHP中使用while()
实现?
我已经更新了代码,请在底部查看。
哇,真的很管用。非常感谢以上是关于使用 while 循环对多维数组进行编码的主要内容,如果未能解决你的问题,请参考以下文章