2016-08-05 29 views
1

我想使用一个mysql存储过程返回一个JSON字符串,可以变成一个关联数组使用PHP的json_decode函数。我有一个有效的JSON字符串从s.p返回,但它不是正确的形式或json_decode($skusJson, true);不喜欢它出于某种原因。用于获取SP的结果,并做json_decode的PHP代码:正确的格式从MySQL存储过程和php的关联数组json_decode

$partsQuery = $this->Orders->callSP('part_skus_dropdown1'); 
    $skusJson = $partsQuery->fetchAll('assoc'); 
    $partsQuery->closeCursor(); 
    $skus = json_decode($skusJson[0]['json'], true); 

MySQL的SP是:

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相匹配,而是以字符串而不是ints存储)。所述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' 
    ] 

我提前:)

+0

为什么你想让你的最终数组看起来像那样?只是想知道 – thedarklord47

+0

@ thedarklord47它将在选择下拉菜单中使用,以允许用户根据零件SKU选择零件。我最初只是用sp来拉动所有的零件信息,并通过这些结果循环javascript来更新选择选项,但是这对于20k零件来说太慢了...... – BSounder

+0

有很可能有更好的方式去做它(我很想听),但我想避免循环,最好使用存储过程来减少Web服务器上的负载。 – BSounder

回答

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都会在整数和字符串之间自动转换。

+0

ahhh你钉了它!这就是我正在寻找的。谢谢! – BSounder

1

您的问题是,卡住...我一直在关注的http://php.net/json_decode文档和使用http://jsonlint.com/检查SP的结果,但认为它的时间来寻求帮助...谢谢您需要将行转换为由t键控的关联数组他的身份证。这将做到

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

然后你可以json_encode /解码,如你所愿。

,如果你使用的是PDO为您的MySQL调用,检查出this answer避免循环完全

+0

哦,那个链接看起来很有希望......现在给它一个镜头。会告诉你这件事的进展的。谢谢! – BSounder