这一次我遇到一个与递归相关的问题:
我正在尝试转型
此json:
["buyer_name", ["first_name", "aaa", "second_name", "bbb"]]
进入此php序列化数组:
s:10:"buyer_name";a:2:{s:10:"first_name";s:3:"aaa";s:11:"second_name";s:3:"bbb";};
使用MariaDB过程。
我在MariaDB中构建了这个简单的过程。
-- ----------------------------
-- Function getSerializedString
-- ----------------------------
DROP PROCEDURE IF EXISTS `getSerializedString`;
CREATE PROCEDURE `getSerializedString`(IN __input_string TEXT, OUT __output TEXT)
LANGUAGE SQL DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER
COMMENT 'Procedure returns a serialized __input_string with his __input_value.'
BEGIN
/*
Procedure returns a serialized __input_string with his __input_value.
*/
DECLARE i INT UNSIGNED DEFAULT 0;
IF (__output IS NULL) THEN
SET __output = '';
END IF;
SET GLOBAL max_sp_recursion_depth = 255;
WHILE (i < (JSON_LENGTH(__input_string))) DO
IF (JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')) REGEXP '^[0-9]+$') THEN
SET __output = CONCAT(__output, CONCAT('i', ':', JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')), ';'));
ELSEIF (CHAR_LENGTH(JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']'))) - CHAR_LENGTH(REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')), '.', '')) = 1) THEN
SET __output = CONCAT(__output, CONCAT('d', ':', JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')), ';'));
ELSE
SET __output = CONCAT(__output, CONCAT('s', ':', (CHAR_LENGTH(REPLACE(JSON_EXTRACT(@__input_string, CONCAT('$[' , i, ']')), '"', ''))), ':', JSON_EXTRACT(__input_string, CONCAT('$[' , i, ']')), ';'));
END IF;
IF (JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')) REGEXP '^[0-9]+$') THEN
SET __output = CONCAT(__output, CONCAT('i', ':', JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), ';'));
ELSEIF (CHAR_LENGTH(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']'))) - CHAR_LENGTH(REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), '.', '')) = 1) THEN
SET __output = CONCAT(__output, CONCAT('d', ':', JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), ';'));
ELSEIF ((REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), '.', '')) NOT REGEXP '^[0-9]+$') THEN
IF (SUBSTRING(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), 1, 1) = '[' AND SUBSTRING(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), CHAR_LENGTH(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']'))), 1) = ']') THEN
CALL `getSerializedString`(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), @res);
SET __output = CONCAT(__output, CONCAT('a', ':', (JSON_LENGTH(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']'))) DIV 2), ':', '{', @res, '}'));
ELSE
SET __output = CONCAT(__output, CONCAT('s', ':', (CHAR_LENGTH(REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), '"', ''))), ':', JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), ';'));
END IF;
ELSE
SET __output = CONCAT(__output, CONCAT('s', ':', (CHAR_LENGTH(REPLACE(JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), '"', ''))), ':', JSON_EXTRACT(__input_string, CONCAT('$[' , (i + 1), ']')), ';'));
END IF;
SET i = i + 2;
END WHILE;
END;
现在:
如果我只用这样的条目运行该过程:
[“名字”,“ aaa”,“年龄”,25]
它给出正确的结果。
当过程检测到嵌套数组时,就会出现问题,例如: [“ buyer_name”,[“ first_name”,“ aaa”,“ age”,25]]
并使用嵌套数组递归调用函数,在这种情况下: [“ first_name”,“ bbb”,“年龄”,30]
MariaDB返回null或空值。
以这种方式调用递归过程是否有错误?
如果该过程检测到没有嵌套数组,则说明它是完美的。
顺便说一句:我正在考虑json数组总是成对出现name:value。这就是为什么WHILE(i)增加2的原因。
感谢您的帮助和支持!!!