【发布时间】:2016-12-12 06:08:06
【问题描述】:
我正在尝试使用 mysql 存储过程返回一个 JSON 字符串,该字符串可以使用 PHP 的 json_decode 函数转换为关联数组。我从 s.p 返回了一个有效的 JSON 字符串,但它的格式不正确,或者 json_decode($skusJson, true); 出于某种原因不喜欢它。获取 s.p 结果并执行 json_decode 的 PHP 代码是:
$partsQuery = $this->Orders->callSP('part_skus_dropdown1');
$skusJson = $partsQuery->fetchAll('assoc');
$partsQuery->closeCursor();
$skus = json_decode($skusJson[0]['json'], true);
mysql s.p 是:
CREATE DEFINER=`root`@`localhost` PROCEDURE `part_skus_dropdown1`()
BEGIN
SELECT
CONCAT('[',
GROUP_CONCAT(
CONCAT('{"id":',id),
CONCAT(',"sku":"',sku,'"}')
),
']')
AS json FROM parts where id < 25;
END
生成的 JSON 字符串为:
[
{
"id" : 1,
"sku" : "1"
},
{
"id" : 3,
"sku" : "3"
},
{
"id" : 6,
"sku" : "6"
},
{
"id" : 7,
"sku" : "7"
},
{
"id" : 9,
"sku" : "9"
}
]
(sku 并不总是与 id 匹配,并且存储为字符串而不是整数)。 json_decoding的结果是:
[
(int) 0 => [
'id' => (int) 1,
'sku' => '1'
],
(int) 1 => [
'id' => (int) 3,
'sku' => '3'
],
(int) 2 => [
'id' => (int) 6,
'sku' => '6'
],
(int) 3 => [
'id' => (int) 7,
'sku' => '7'
]
]
无论如何我可以得到结果数组的形式为 [id => sku]: (alt. sku 格式显示)
[
(int) 1 => '1',
(int) 3 => '3',
(int) 58 => '3-BOX100'
]
我被困住了...我一直在关注http://php.net/json_decode 文档并使用http://jsonlint.com/ 来检查 sp 的结果,但认为是时候寻求帮助了...在此先感谢 :)
【问题讨论】:
-
为什么你想让你的最终数组看起来像这样?只是想知道
-
@thedarklord47 它将在选择下拉列表中使用,以允许用户根据零件 sku 选择零件。我最初打算只使用一个 s.p 来提取所有零件信息并循环通过这些结果 javascript 来更新选择选项,但是这对于 20k 零件来说太慢了......
-
很可能有更好的方法来解决它(我很乐意听到),但我想避免循环,最好使用存储过程来减少 Web 服务器上的负载跨度>
-
您是否偶然将 PDO 用于您的 MySQL?
标签: php mysql arrays json cakephp