2017-02-17 4 views
0

У меня есть строка, как это:Заменить запятую в части строки

'test', 'test', 'test, test', NULL, NULL, NULL, 123456789012, 0, '2017-02-17', FALSE 

Я хочу, чтобы взорвать его в массив.

Но это путается, когда частичная строка содержит запятую ('test, test').

Как заменить запятые в частичной строке на какой-нибудь другой символ? (так что взрыв будет работать).

Апоптопы в строке должны быть включены, поэтому str_getcsv() не может использоваться.

+2

трудно ответить на ваш вопрос правильно, когда вы меняете требование после того, как кто-то уже ответил ;-) – Roman

ответ

1

Вот мой способ:

$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 обрабатывает больше вещей, чем эта проблема с цитатой:

1

Вы можете сделать это вручную, так и улучшить его для поддержки большего числа случаев ... Попробуйте что-то вроде этого:

$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 
) 

Примечание: это будет держать «пустые» пространства вокруг запятые

1

Попробуйте использовать str_getcsv

str_getcsv($string, ",", "'"); 
Смежные вопросы