【问题标题】:Associative array in correct format from mysql stored procedure and php json_decode来自mysql存储过程和php json_decode的正确格式的关联数组
【发布时间】: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


【解决方案1】:

更改您的过程,使其返回单个 JSON 对象,而不是数组,然后使用 id 作为键,sku 作为每个元素中的值

CREATE DEFINER=`root`@`localhost` PROCEDURE `part_skus_dropdown1`()
BEGIN
    SELECT 
        CONCAT('{',
            GROUP_CONCAT(
                CONCAT('"',id, '": "',sku,'"')
            ),
            '}')
    AS json FROM parts where id < 25;
END   

DEMO

请注意,JSON 对象的键始终是字符串,它们不能是整数。但是 PHP 和 Javascript 在访问数组时都会自动在整数和字符串之间进行转换。

【讨论】:

  • 啊,你成功了!!这正是我想要的。谢谢!
【解决方案2】:

您的问题是您需要将行转换为以 id 为键的关联数组。这样就可以了

function rowsToAssoc ($rows) {
    $assoc = Array();
    for ($rows as $r) {
        $assoc[$r['id']] = $r['sku'];
    }
    return $assoc;
}

然后您可以根据需要进行 json_encode/decode。

如果您在 MySQL 调用中使用 PDO,请查看 this answer 以避免完全循环

【讨论】:

  • ooo 那个链接看起来很有希望......现在试一试。会告诉你这件事的进展的。谢谢!
猜你喜欢
  • 2014-05-10
  • 2015-07-16
  • 2015-04-23
  • 1970-01-01
  • 2021-07-20
  • 2011-08-24
  • 2022-06-30
  • 2017-04-07
  • 2016-09-15
相关资源
最近更新 更多