Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从以“,”分隔的字符串中形成两个数组&引用;然后是-?_Php_Arrays_Regex_String - Fatal编程技术网

Php 如何从以“,”分隔的字符串中形成两个数组&引用;然后是-?

Php 如何从以“,”分隔的字符串中形成两个数组&引用;然后是-?,php,arrays,regex,string,Php,Arrays,Regex,String,我试图从$str中提取字符串,这些字符串在一个数组中以“,”分隔,在“-”之前,在第二个数组中以“,”分隔,在“-”之后。因此,$arr1=数组(a,b,c,d)和$arr2=数组(e、f、g、h)。我只是以$str为例,通常我希望它适用于任何形式相同的字符串,即$str=s1、s2、s3、s4、s5、.-r1、r2、t3…… 注意:若$str中并没有“-”,那个么$arr2将消失,并且$arr1包含一个由“,”分隔的元素数组 这就是我试过的 $str="a,b,c,d-e,f,g,h" 但是

我试图从
$str
中提取字符串,这些字符串在一个数组中以“,”分隔,在“-”之前,在第二个数组中以“,”分隔,在“-”之后。因此,
$arr1=数组(a,b,c,d)
$arr2=数组(e、f、g、h)。我只是以
$str
为例,通常我希望它适用于任何形式相同的字符串,即
$str=s1、s2、s3、s4、s5、.-r1、r2、t3……

注意:若
$str
中并没有“-”,那个么
$arr2
将消失,并且
$arr1
包含一个由“,”分隔的元素数组

这就是我试过的

$str="a,b,c,d-e,f,g,h"
但是,每个数组都有一个包含字符串
str
的元素。 有人知道为什么这不起作用吗

preg_match_all('~(^|.*,)(.*)(,.*|\-|$)~', $str, $arr1);
preg_match_all('~(-|.*,)(.*)(,.*|$)~', $str, $arr2);

您可以简单地使用
preg\u match
检查您的字符串是否包含
-
如果是,则可以简单地使用
array\u walk
如下

^(.*?(?=-|$))(?:-(.*$))?

您的所有正则表达式模式都不是最优的,而且似乎使用和更容易解决此任务:

array\u map()
对每个元素应用回调函数后,返回包含
array1
的所有元素的数组。回调函数接受的参数数量应与传递给
array\u map()

结果:

$str="a,b,c,d-e,f,g,h";
$ex = array_map(function ($s) {
       return explode(",", $s);
    }, explode("-", $str));
print_r($ex);
没有正则表达式(最合理的方法):

使用正则表达式(用于挑战):


这不适用于格式为
'-a、b、c、d'
的字符串。元素
a
b
c
d
提取在
$arr1
中,而不是
$arr2
中查看-这是您需要的吗?如果您有任何疑问,请随时发表评论。向下投票人至少张贴向下投票的原因。所以我可以改进我的答案
$str = 'a,b,c,d-e,f,g,h';
$result = [];
if(preg_match('/[-]/', $str)){
    array_walk(explode('-',$str),function($v,$k)use(&$result){
        $result[] = explode(',',$v);
    });
}else{
    array_walk(explode(',',$str),function($v,$k)use(&$result){
        $result[] = $v;
    });
}
print_r($result);
$str="a,b,c,d-e,f,g,h";
$ex = array_map(function ($s) {
       return explode(",", $s);
    }, explode("-", $str));
print_r($ex);
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
            [2] => c
            [3] => d
        )

    [1] => Array
        (
            [0] => e
            [1] => f
            [2] => g
            [3] => h
        )

)
$str="a,b,c,d-e,f,g,h";

list($arr1, $arr2) = explode('-', $str);

$arr1 = explode(',', $arr1);

if ($arr2)
    $arr2 = explode(',', $arr2);
else
    unset($arr2);
if (preg_match_all('~(?:(?!\G)|\A)([^-,]+)|-?([^,]+),?~', $str, $m)) {
    $arr1 = array_filter($m[1]);
    if (!$arr2 = array_filter($m[2]))
        unset($arr2);
}