Php 我想用一种稍微不同的方式分解一个变量

Php 我想用一种稍微不同的方式分解一个变量,php,Php,我有这个变量 $var = "A,B,C,D,'1,2,3,4,5,6',E,F"; 我想把它分解,得到下面的数组 array( [0] => A, [1] => B, [2] => C, [3] => D, [4] => 1,2,3,4,5,6, [5] => E, [6] => F ); 我使用了explode(',',$var),但没有得到所需的输出。有什么建议吗?您需要将字符串分解为数组 但是,除了最后一个元素之外,每个元素后面都需要逗号 下

我有这个变量

$var = "A,B,C,D,'1,2,3,4,5,6',E,F";
我想把它分解,得到下面的数组

array(
[0] => A,
[1] => B,
[2] => C,
[3] => D,
[4] => 1,2,3,4,5,6,
[5] => E,
[6] => F
);

我使用了
explode(',',$var)
,但没有得到所需的输出。有什么建议吗?

您需要将字符串分解为数组

但是,除了最后一个元素之外,每个元素后面都需要逗号

下面是一个工作示例:

<?php
$var = "A,B,C,D,'1,2,3,4,5,6',E,F";
$arr = explode("'", $var);
$num = ! empty($arr[1]) ? str_replace(',', '_', $arr[1]) : '';
$nt = $arr[0] . $num . $arr[2]; 
$nt = explode(',', $nt);
$len = count($nt);
$na = array();
$cnt = 0;
foreach ($nt as $v) {
    $v = str_replace('_', ',', $v);
    $v .= ($cnt != $len - 1) ? ',' : '';
    $na[] = $v;
    ++$cnt; 
}

只需将
preg\u match\u all
与以下正则表达式一起使用,如下所示

preg_match_all("/(?<=').*(?=')|\w+/",$var,$m);
print_r($m[0]);
preg\u match\u all(“/(?
$var=“A,B,C,D,'1,2,3,4,5,6',E,F”;
$arr=preg_split(“/(,)(?=(?:[^'].'[^']*')*$)/”,$var);
foreach($arr作为$data){
$requiredData[]=str_replace(“,”,$data);
}
回声';
打印(所需数据);
说明: 常规经验:-

$var = "A,B,C,D,'1,2,3,4,5,6',E,F";

$a = explode("'",$var);

//print_r($a);
/*
outputs
Array
(
    [0] => A,B,C,D,
    [1] => 1,2,3,4,5,6
    [2] => ,E,F
)
*/
$firstPart = explode(',',trim($a[0],',')); //take out the trailing comma
/*
print_r($firstPart);
outputs
Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => D
)
*/
$secondPart = array($a[1]);

$thirdPart = explode(',',trim($a[2],',')); //tale out the leading comma
/*
print_r($thirdPart);
Array
(
    [0] => E
    [1] => F
)
*/

$fullArray = array_merge($firstPart,$secondPart,$thirdPart);
print_r($fullArray);
/*
ouputs
Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => D
    [4] => 1,2,3,4,5,6
    [5] => E
    [6] => F
)
*/
(?用于获取单引号(“”)中的所有字符,
|\w+|(或)=>用于获取除逗号(,)之外的其他字符

然后在foreach循环中,我将替换单引号

虽然
preg\u split
以及
array\u map
工作得很好,请参见下面使用
explode
trim
的示例

array str_getcsv ( string $input [, string $delimiter = "," [, string $enclosure = '"' [, string $escape = "\\" ]]] )

有一个现有函数可以解析逗号分隔的字符串

它的签名是这样的:

$var = "A,B,C,D,'1,2,3,4,5,6',E,F";
$array = str_getcsv($var,',',"'");
您唯一的更改是将第三个变量enclosure更改为单引号,而不是默认的双引号

这是一个样本

array(7) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
  [3]=>
  string(1) "D"
  [4]=>
  string(11) "1,2,3,4,5,6"
  [5]=>
  string(1) "E"
  [6]=>
  string(1) "F"
}
如果你
var\u dump
数组,你会得到你想要的格式:



我不想在1,2,3,4,5,6Hi@Uchiha前后使用“Hi@Uchiha你能解释一下regexp吗?谢谢你。@Uchiha非常感谢你。@Uchiha用户在哪里?我没有得到我想要的输出。Hi@Uchiha,谢谢你的体育精神。但是,你的答案比我的好10倍。可能是,但你的答案是现成的。@Studio。无论如何,谢谢你的赞赏。甚至@Alex答案很好,非常好,简单易懂。非常感谢。好的@AlexAndrei+1好的@AlexAndrei,+1解释性的@AlexAndrei,+1不太好,我发布答案是为了完整性,我喜欢你的答案,老实说,@Studio's更好:)但在这里,我们将程序的中间部分绑定为“”。我希望它是泛型的。代码可以是任何东西。它内部可能有多个
'1,2,3'
。您需要的是CSV解析器。请分解字符串,而不是您的代码:-)对代码所做操作的描述将提高此答案的质量。如果您想在结果中添加“的话,这将爆炸。而且您实际上不需要将逗号分组。乍一看(可能是第二眼和第三眼)很难理解这一点,尤其是与正确答案相比,
str_getcsv()
。我打赌这对
“A,B,C,D,'1,2,3,'4,5,6',E,F”
是错误的。你不能用正则表达式构建解析器。正则表达式:-(?用于获取单引号内的所有字符(“”)\w+|(或)=>用于获取除逗号(,)以外的其他字符,然后在foreach循环中我将替换单引号
$var = "A,B,C,D,'1,2,3,4,5,6',E,F";
$array = str_getcsv($var,',',"'");
array(7) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
  [3]=>
  string(1) "D"
  [4]=>
  string(11) "1,2,3,4,5,6"
  [5]=>
  string(1) "E"
  [6]=>
  string(1) "F"
}