У меня есть эта переменная.
$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)
но я не получаю желаемого результата. Какие-либо предложения?
Существует существующая функция, которая может анализировать вашу разделенную запятыми строку. Функция str_getcsv
Это подпись такая:
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,',',"'");
Если вы var_dump
массив, вы получите var_dump
формат:
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" }
Просто используйте preg_match_all
со следующим регулярным выражением следующим образом
preg_match_all("/(?<=').*(?=')|\w+/",$var,$m); print_r($m[0]);
Регулярное выражение Пояснение:
(?<=').*(?=')
Захват каждого символа внутри '(quotes)
|\w+
|(OR)
Будет хватать остальную часть символов, кроме ,
демонстрация
Regex
Несмотря на то, что preg_split
вместе с array_map
работает очень хорошо, см. Ниже пример с использованием explode
и trim
$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 ) */
Вам нужно взорвать строку в массиве.
Но вам нужны запятые после каждого элемента, кроме последнего.
Вот рабочий пример:
<?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; }
демонстрация
$var = "A,B,C,D,'1,2,3,4,5,6',E,F"; $arr = preg_split("/(,)(?=(?:[^']|'[^']*')*$)/",$var); foreach ($arr as $data) { $requiredData[] = str_replace("'","",$data); } echo '<pre>'; print_r($requiredData);
Описание: Regular Exp. : –
(?<=').*(?=') => Used to get all characters within single quotes(' '), |\w+ |(OR) => Used to get rest of characters excepted comma(,)
Затем внутри цикла foreach я заменяю одиночную кавычку