У меня есть строка, которая может быть
$string = "value.";
ИЛИ
$string = "value1, value2.";
Я хочу, чтобы итерация через эту строку получала каждый элемент, который -> value
(в первом примере), и -> value1
И value2
во втором (без запятой или точкой в конце).
Я думал;
Правильно ли это?
Я новичок в 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/>"; }