解析 SQL CALL 语句并使用其参数创建一个数组

问题描述 投票:0回答:2

我想将一根绳子分解成不同的部分,由于绳子的性质,我无法完全弄清楚如何去做这件事或者是否可能。

下面是我试图分解的字符串:

"'1,2,3,4','2,4,5,6,4',NULL, NULL,NULL ,'2,3,4,5', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL"

我想要这样:

'1,2,3,4',
'2,4,5,6,4',
NULL,
NULL,
'2,3,4,5'

我正在考虑做这样的事情:

$test = 'CALL sp_advert_search_load(\'1,3,4,5\',\'2,4,3\',NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)';
$test1 = explode( '(',$test);
$test1 = explode( ',',$test1[1]);

foreach ($test1 as $food) {
    echo $food."<br />";
}

然后尝试使用 ' 以及起点和终点以某种方式将数组重新构建为字符串。

php arrays string-parsing
2个回答
2
投票

你似乎有两个问题,但这还是把它分成了两部分。

首先是从

CALL
中提取参数部分,这会找到第一个
(
并获取字符串的其余部分。 然后它使用
rtrim()
去除尾随的
)
(如果有的话也可以使用空格)。

第二部分是将字符串拆分为每个参数。 由于它现在实际上是一个 CSV,因此我使用

str_getcsv()
进行拆分,并用
'
作为外壳将各组保持在一起...

$test = 'CALL sp_advert_search_load(\'1,3,4,5\',\'2,4,3\',NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)';

$params = rtrim(substr($test, strpos($test, "(") + 1), " )");
print_r(str_getcsv($params, ",", "'"));

给予...

Array
(
    [0] => 1,3,4,5
    [1] => 2,4,3
    [2] => NULL
    [3] =>  NULL
    [4] =>  NULL
    [5] =>  NULL
    [6] =>  NULL
    [7] =>  NULL
    [8] =>  NULL
    [9] =>  NULL
    [10] =>  NULL
    [11] =>  NULL
    [12] =>  NULL
    [13] =>  NULL
    [14] =>  NULL
    [15] =>  NULL
    [16] =>  NULL
    [17] =>  NULL
    [18] =>  NULL
    [19] =>  NULL
    [20] =>  NULL
    [21] =>  NULL
    [22] =>  NULL
    [23] =>  NULL
    [24] =>  NULL
    [25] =>  NULL
    [26] =>  NULL
    [27] =>  NULL
    [28] =>  NULL
    [29] =>  NULL
    [30] =>  NULL
)

0
投票

因为我很无聊,只需提取括号之间的内容,然后

eval
将其作为数组:

preg_match('/\(.*\)/', $test, $match);
eval("\$result = array$match[0];");

或者:

preg_match('/\((.*)\)/', $test, $match);
eval("\$result = [$match[1]];");

这些将为您提供实际的

NULL
值,而不是字符串
"NULL"
,因此您只能在
var_dump
中看到它们。

© www.soinside.com 2019 - 2024. All rights reserved.