Итерирование PHP через простой список, разделенный запятыми

У меня есть строка, которая может быть

$string = "value."; 

ИЛИ

 $string = "value1, value2."; 

Я хочу, чтобы итерация через эту строку получала каждый элемент, который -> value (в первом примере), и -> value1 И value2 во втором (без запятой или точкой в ​​конце).

Я думал;

  1. Замените точку в конце.
  2. Проверьте, нет ли запятой.
  3. Если есть запятая, split-explode с помощью «,» и итерация.
  4. Если нет, используйте только один элемент.

Правильно ли это?

Я новичок в PHP и пытаюсь изучить лучшие практики и лучшие способы решения проблем.

Спасибо.

Вы абсолютно правы, вы можете сделать это так:

 $string = 'foo, bar, baz.'; $string = preg_replace('/\.$/', '', $string); //Remove dot at end if exists $array = explode(', ', $string); //split string into array seperated by ', ' foreach($array as $value) //loop over values { echo $value . PHP_EOL; //print value } 
 $string = "value 1, value2"; $string = trim($string, "."); $split = explode(",", $string); print_r($split); 

Я знаю, что на это был дан ответ, но вы могли бы сделать это с помощью одной команды:

 $input = "foo, bar, baz., shibby, poop."; //-- handles it all in one pass $output = preg_split('/[\.,\s]/', $input, -1, PREG_SPLIT_NO_EMPTY); //-- just output array_walk($output, function(&$item, $idx) { echo $idx . ': ' . $item . PHP_EOL; }); 

Однако, если вы ожидаете пробелов в своих значениях, это тоже разделит их. Я просто добавил \s в регулярное выражение, чтобы обрезать элементы. Если вы ожидаете пробелов в значениях, то опускайте \s в регулярном выражении и trim() элементы позже.

Или, это регулярное выражение будет воспроизводить то же самое: /(\.\s?|,\s?)/

 $input = "foo, bar, baz., shibby, poop. foo bar"; //-- handles it all in one pass $output = preg_split('/(\.\s?|,\s?)/', $input, -1, PREG_SPLIT_NO_EMPTY); //-- just output array_walk($output, function(&$item, $idx) { echo $idx . ': ' . $item . PHP_EOL; }); 

Производит

 0: foo 1: bar 2: baz 3: shibby 4: poop 5: foo bar 

Regex: объяснено

Исходное регулярное выражение просто разбивается на отдельные символы в строке, как показано в [ и ] . Таким образом, /[\.,\s]/ соответствует /[\.,\s]/ периода, запятой и /[\.,\s]/ в строке. Подумав об этом, это, вероятно, не то, что вы хотите, но близко.

Обновленное регулярное выражение немного отличается и разбивается на два разных сценария. \.\s? говорит: раскол на период и / или предд + пробел. ? делает предыдущий необязательный (я считаю, 0 или 1). То же самое с ,\s? , Матч по запятой и / или запятой + пробел. Это объясняет все сценарии. Использование группировки ( (...) ) вместо диапазонов символов позволяет это. Труба | в средстве означает OR, поэтому полное средство регулярных выражений означает совпадение по периоду и / или периоду + пробел или запятую и / или запятую + пробел.

Вы не должны делать 2 и 4. Если запятая отсутствует, она будет разбита на массив одного элемента.

Я бы использовал следующий код:

 $string = "value1, value2."; $arr = explode(', ', trim($string, '.')); print_r($arr); 

ВЫВОД

 Array ( [0] => value1 [1] => value2 ) 

Когда вы взорваетесь, и вы не запросили разделителя, результат в индексе 0 – целая строка.

 <?php $string = "test, test2., test3, test4"; print_r( explode(',', $string) ); //Array //( // [0] => test // [1] => test2. // [2] => test3 // [3] => test4 //) $string = "test test2. test3 test4"; print_r( explode(',', $string) ); //Array //( // [0] => test test2. test3 test4 //) 

попробуйте этот код

 $arr="mosin,avinash,suchit"; $variableAry=explode(",",$ar); foreach($variableAry as $var) { echo"<input type='text' value=".$var." ><br/><br/>"; }