来自mysql存储过程和php json_decode的正确格式的关联数组

时间:2016-08-05 18:34:30

标签: php mysql arrays json cakephp

我正在尝试使用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 =&gt; sku] :(显示alt.sku格式)

    [
        (int) 1 => '1',
        (int) 3 => '3',
        (int) 58 => '3-BOX100'
    ]

我被卡住了......我一直在关注http://php.net/json_decode文档,并使用http://jsonlint.com/查看sp的结果,但是请考虑一下寻求帮助的时间...提前感谢:)

2 个答案:

答案 0 :(得分:2)

更改您的过程,使其返回单个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都会自动在整数和字符串之间进行转换。

答案 1 :(得分:1)

您的问题是您需要将行转换为由id键入的关联数组。这样做

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

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

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