PHP将字符串拆分为两个数组 - 值拆分和分隔符

时间:2014-01-08 20:53:54

标签: php explode preg-split

我想分割一个字符串,最有可能使用explode或preg_split来创建两个数组。首先是分手了。秒是分隔符。只有两个分隔符是“AND”或“OR”。

例如:

$ string =“Name = John AND St​​ate = GA OR State = CA”;

我不仅要捕获'Name = John,State = GA,State = CA',还要捕获每个之间的分隔符。

对于此示例,两个单独的数组将是:

array (
        [0] => Name=John
        [1] => State=GA
        [2] => State=CA   
)

array (
        [0] => AND
        [1] => OR
)

从这里我可以按摩数据以符合我的要求,最终构建一个查询。如果有一个更好的方法来解决这个问题,我会全力以赴。感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

使用PHP Regular Expression。您的案例中的preg_match_all()函数:

Live Demo

代码:

$input = "Name=John AND State=GA OR State=CA";

preg_match_all("/[a-zA-Z]+\s*=\s*[a-zA-Z]+/", $input, $output_1);
$output_1 = $output_1[0];


preg_match_all("/AND|OR/", $input, $output_2);
$output_2 = $output_2[0];

print_r($output_1);
print_r($output_2);

输出:

Array
(
    [0] => Name=John
    [1] => State=GA
    [2] => State=CA
)
Array
(
    [0] => AND
    [1] => OR
)

答案 1 :(得分:0)

如果该字符串中的每个其他部分都是分隔符(AND | OR),则不需要使用正则表达式。通过空格字符将该字符串爆炸为数组,然后将每个其他项目选择到一个数组,将其他项目选择到另一个数组。像这样:

<?php
$string = "Name=John AND State=GA OR State=CA";
$a = explode(' ', $string);

$foo = array();
$bar = array();
$len = count($a);

for($i = 0; $i < $len; $i++) {
    if($i % 2 === 0) {
        $foo[] = $a[$i];
    }
    else {
        $bar[] = $a[$i];
    }
}

print_r($foo);
print_r($bar);

https://eval.in/87538

如果该字符串中的项目总数相同,则无需循环遍历它,只需将项目0,2和4分配给一个数组,将1和3分配给其他数组。

答案 2 :(得分:0)

state值很可能是俄勒冈州的( OR ),这意味着@rullof的答案不可靠。

通过在输入字符串的一次传递中使用值,可以稳定任务。

可以通过array_column()提取两组。

代码:(Demo

$string = "Name=John AND State=OR OR State=CA";

if (preg_match_all(
        '~([a-zA-Z]+=\S+)(?: ([A-Z]{2,3}))?~',
        $string,
        $out,
        PREG_SET_ORDER
    )
) {
    echo "data = ";
    var_export(array_column($out, 1));
    echo "\nconjunctions = ";
    var_export(array_column($out, 2));
}

输出:

data = array (
  0 => 'Name=John',
  1 => 'State=OR',
  2 => 'State=CA',
)
conjunctions = array (
  0 => 'AND',
  1 => 'OR',
)