我有一个包含用户访问过滤器的表。这些过滤器包含一个特定的 MySQL 范围,用户可以在其中搜索数据,例如:
start_time >= '2021-07-29 12:00' AND end_time <= '2021-07-30 12:00' AND customer_id = '12' AND wipe_status = 'SUCCESS'
所有这些都存储在一个字符串中。我希望将字符串分开,以便在这种情况下得到以下内容:
$end_time = end_time <= '2021-07-30 12:00'
$customer_id = customer_id = '12'
$wipe_status = wipe_status = 'SUCCESS'
问题是这些的长度是可变的,所以我不确定如何使用子字符串来分隔这些。有时过滤器也会包含和“OR”,所以我不能简单地用 AND 分隔。你对我将如何做这件事有什么想法吗?
答案 0 :(得分:1)
我更喜欢创建一个字典,其键对应于 WHERE
子句中的列。我们可以对 AND
或 OR
进行正则表达式拆分,然后迭代这些术语以填充字典。
$input = "start_time >= '2021-07-29 12:00' AND end_time <= '2021-07-30 12:00' AND customer_id = '12' AND wipe_status = 'SUCCESS'";
$parts = preg_split("/\s+(?:AND|OR)\s+/", $input);
$vals = array();
foreach ($parts as $part) {
$vals[explode(" ", $part)[0]] = $part;
}
print_r($vals);
打印:
Array
(
[start_time] => start_time >= '2021-07-29 12:00'
[end_time] => end_time <= '2021-07-30 12:00'
[customer_id] => customer_id = '12'
[wipe_status] => wipe_status = 'SUCCESS'
)
答案 1 :(得分:1)
如果您愿意,可以使用 explode
来执行此操作。一个例子是:
$source = "start_time >= '2021-07-29 12:00' AND end_time <= '2021-07-30 12:00' AND customer_id = '12' AND wipe_status = 'SUCCESS'";
$output = array();
foreach (explode(" AND ", $source) as $value) {
foreach (explode(" OR ", $value) as $value2) {
$output[] = $value2;
}
}
var_dump($output);
这将输出:
array(4)
{
[0]=> string(32) "start_time >= '2021-07-29 12:00'"
[1]=> string(30) "end_time <= '2021-07-30 12:00'"
[2]=> string(18) "customer_id = '12'"
[3]=> string(23) "wipe_status = 'SUCCESS'"
}
这将根据要求适用于 AND
或 OR
。
重要说明:explode
区分大小写。如果使用了非大写的 AND
或 OR
,那么这将不起作用。如果没有保证的情况,更好的选择是使用已在答案中显示的正则表达式方法 preg_split
。