替换部分字符串中的逗号
Replace comma within partial string
我有这样的字符串:
'test', 'test', 'test, test', NULL, NULL, NULL, 123456789012, 0, '2017-02-17', FALSE
我想把它炸成数组
但是当部分字符串包含逗号 ('test, test') 时,这会变得混乱。
如何将部分字符串中的逗号替换为其他字符? (所以爆炸会起作用)。
字符串中必须包含撇号,所以不能使用str_getcsv()。
您可以手动执行此操作并对其进行改进以支持更多情况...尝试这样的操作:
$arr = array();
$arr[0] = "";
$arrIndex = 0;
$strOpen = false;
for ($i = 0; $i < mb_strlen($str); $i++){
if ($str[$i] == ',') {
if ($strOpen == false) {
$arrIndex++;
$arr[$arrIndex] = "";
}
else {
$arr[$arrIndex] .= $str[$i];
}
}
else if ($str[$i] == '\'') {
$strOpen = !$strOpen;
}
else {
$arr[$arrIndex] .= $str[$i];
}
}
结果:
Array
(
[0] => test
[1] => test
[2] => test, test
[3] => NULL
[4] => NULL
[5] => NULL
[6] => 123456789012
[7] => 0
[8] => 2017-02-17
[9] => FALSE
)
注意:它将在逗号周围保留 "empty" 个空格
尝试使用 str_getcsv
str_getcsv($string, ",", "'");
这是我的方法:
$string = "'test', 'test', 'test, test, kk', NULL, NULL, NULL, 123456789012, 0, '2017-02-17', FALSE";
$array_tmp = explode(', ', $string);
$array = array();
$index_buffer = NULL;
$index = 0;
foreach($array_tmp as $value) {
// Check if we need to append to buffered entry
if($index_buffer !== NULL){
$array[$index_buffer] .= ', ' . $value;
if($value[strlen($value) - 1] === "'"){
$index_buffer = NULL;
}
continue;
}
// Check if it's not ended string
if(is_string($value) && $value[0] === "'" && $value[strlen($value) - 1] !== "'"){
// It is not ended, set this index as buffer
$index_buffer = $index;
}
// Save value
$array[$index] = $value;
$index++;
}
echo '<pre>' . print_r($array, true);
输出:
Array
(
[0] => 'test'
[1] => 'test'
[2] => 'test, test, kk'
[3] => NULL
[4] => NULL
[5] => NULL
[6] => 123456789012
[7] => 0
[8] => '2017-02-17'
[9] => FALSE
)
或者这可能更合适,但你丢失了引号,我想,如果你的输入字符串不符合所有 csv 标准,你可能会产生边框效果,因为 str_getcsv 处理的事情比这个引号问题更多:
str_getcsv($string, ",", "'");
我有这样的字符串:
'test', 'test', 'test, test', NULL, NULL, NULL, 123456789012, 0, '2017-02-17', FALSE
我想把它炸成数组
但是当部分字符串包含逗号 ('test, test') 时,这会变得混乱。
如何将部分字符串中的逗号替换为其他字符? (所以爆炸会起作用)。
字符串中必须包含撇号,所以不能使用str_getcsv()。
您可以手动执行此操作并对其进行改进以支持更多情况...尝试这样的操作:
$arr = array();
$arr[0] = "";
$arrIndex = 0;
$strOpen = false;
for ($i = 0; $i < mb_strlen($str); $i++){
if ($str[$i] == ',') {
if ($strOpen == false) {
$arrIndex++;
$arr[$arrIndex] = "";
}
else {
$arr[$arrIndex] .= $str[$i];
}
}
else if ($str[$i] == '\'') {
$strOpen = !$strOpen;
}
else {
$arr[$arrIndex] .= $str[$i];
}
}
结果:
Array
(
[0] => test
[1] => test
[2] => test, test
[3] => NULL
[4] => NULL
[5] => NULL
[6] => 123456789012
[7] => 0
[8] => 2017-02-17
[9] => FALSE
)
注意:它将在逗号周围保留 "empty" 个空格
尝试使用 str_getcsv
str_getcsv($string, ",", "'");
这是我的方法:
$string = "'test', 'test', 'test, test, kk', NULL, NULL, NULL, 123456789012, 0, '2017-02-17', FALSE";
$array_tmp = explode(', ', $string);
$array = array();
$index_buffer = NULL;
$index = 0;
foreach($array_tmp as $value) {
// Check if we need to append to buffered entry
if($index_buffer !== NULL){
$array[$index_buffer] .= ', ' . $value;
if($value[strlen($value) - 1] === "'"){
$index_buffer = NULL;
}
continue;
}
// Check if it's not ended string
if(is_string($value) && $value[0] === "'" && $value[strlen($value) - 1] !== "'"){
// It is not ended, set this index as buffer
$index_buffer = $index;
}
// Save value
$array[$index] = $value;
$index++;
}
echo '<pre>' . print_r($array, true);
输出:
Array
(
[0] => 'test'
[1] => 'test'
[2] => 'test, test, kk'
[3] => NULL
[4] => NULL
[5] => NULL
[6] => 123456789012
[7] => 0
[8] => '2017-02-17'
[9] => FALSE
)
或者这可能更合适,但你丢失了引号,我想,如果你的输入字符串不符合所有 csv 标准,你可能会产生边框效果,因为 str_getcsv 处理的事情比这个引号问题更多:
str_getcsv($string, ",", "'");