Как поместить строку в массив, разделенный новой строкой?
У меня есть строка с переносами строк в моей базе данных. Я хочу преобразовать эту строку в массив и для каждой новой строки перейти на одно место индекса в массиве.
Если строку:
мой текст1
Мой текст2
Мой текст3
результат, который я хочу, это:
Array
(
[0] => My text1
[1] => My text2
[2] => My text3
)
18 ответов:
можно использовать
explode
, С помощью "\n
" в качестве разделителя :$your_array = explode("\n", $your_string_from_db);
например, если у вас есть этот кусок кода :
$str = "My text1\nMy text2\nMy text3"; $arr = explode("\n", $str); var_dump($arr);
вы получите этот вывод:
array 0 => string 'My text1' (length=8) 1 => string 'My text2' (length=8) 2 => string 'My text3' (length=8)
Обратите внимание, что вы должны использовать строка в двойных кавычках, так что\n
фактически интерпретируется как разрыв строки.
(смотрите эту страницу руководства для получения более подробной информации)
разрыв строки определяется по-разному на разных платформах, \r\n, \r или \n.
используя регулярное выражение для разделения строки, вы можете сопоставить все три с \R
Итак, для вашей проблемы:
$array = preg_split ('/$\R?^/m', $string);
что бы соответствовать разрывы строк на Windows, Mac и Linux!
Я всегда использовал это с большим успехом:
$array = preg_split("/\r\n|\n|\r/", $string);
(обновлено с final \r, спасибо @LobsterMan)
PHP уже знает символы новой строки текущей системы. Просто используйте константу EOL.
explode(PHP_EOL,$string)
альтернатива Давидс ответ который быстрее (путь быстрее) является использование
str_replace
иexplode
.$arrayOfLines = explode("\n", str_replace(array("\r\n","\n\r","\r"),"\n",$str) );
что происходит:
Поскольку разрывы строк могут иметь разные формы, яstr_replace
\r\n, \n\r и \r с \N вместо этого (и оригинал \n сохраняются).
Затем взорваться на\n
и у вас есть все строки в массиве.Я сделал тест на src этой страницы и разделил строки 1000 раз в цикле for и:
preg_replace
занял в среднем 11 секундstr_replace & explode
занял в среднем около 1 секундыболее подробно и bencmark информация о мой форум
Дэвид: отличное направление, но вы пропустили \r. это сработало для меня:
$array = preg_split("/(\r\n|\n|\r)/", $string);
explode("\n", $str);
"(вместо') очень важно, так как в противном случае разрыв строки не будет интерпретироваться.
вам не нужны функции preg_*, ни шаблоны preg, ни str_replace внутри и т. д.. для того чтобы успешно разбить строку на массив по новым строкам. Во всех сценариях, будь то Linux/Mac или m$, это будет сделано.
<?php $array = explode(PHP_EOL, $string); // ... $string = implode(PHP_EOL, $array); ?>
PHP_EOL - константа, удерживающая символ(ы) разрыва строки, используемый серверной платформой.
<anti-answer>
как указано в других ответах, обязательно используйте
explode
, а неsplit
потому что начиная с PHP 5.3.0split
устарела. т. е. ниже не как вы хотите это сделать:$your_array = split(chr(10), $your_string);
LF = "\n " = chr (10), CR = "\r" = chr(13)
</anti-answer>
StackOverflow не позволит мне прокомментировать ответ hesselbom (недостаточно репутации), поэтому я добавляю свой собственный...
$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);
это сработало лучше всего для меня, потому что он также устраняет ведущие (second \s*) и конечные (first \s*) пробелы автоматически, а также пропускает пустые строки (флаг PREG_SPLIT_NO_EMPTY).
- = OPTIONS = -
если вы хотите сохранить ведущие пробелы, просто избавьтесь от второго \s* и сделайте его rtrim() вместо...
$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);
Если вам нужно сохранить пустые строки, избавьтесь от NULL(это только заполнитель) и preg_split_no_empty флаг, например...
$array = preg_split('/\s*\R\s*/', trim($text));
или сохранение как ведущих пробелов, так и пустых строк...
$array = preg_split('/\s*\R/', rtrim($text));
Я не вижу причин, по которым вы когда-либо хотели бы продолжать оставлять пробелы, поэтому я предлагаю оставить первый \s* там. Но, если все, что вы хотите, это разделить на новую строку (как следует из названия), это так просто (как упоминалось Яном Гойваертс)...
$array = preg_split('/\R/', $text);
для тех, кто пытается отобразить cronjobs в crontab и разочаровывается в том, как отделить каждую строку, используйте explode:
$output = shell_exec('crontab -l'); $cron_array = explode(chr(10),$output);
использование '\n', похоже, не работает, но chr (10) отлично работает :D
надеюсь, что это избавит кого-то от головной боли.
вы можете сделать $string = nl2br ($string), чтобы ваш разрыв строки был изменен на
<br />.
таким образом, не имеет значения, использует ли система \r\n или \n или \r
затем вы можете передать его в массив:
$array = explode("<br />", $string);
$str = "My text1\nMy text2\nMy text3"; $arr = explode("\n", $str); foreach ($arr as $line_num => $line) { echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n"; }
правда массива:
$str = "My text1\nMy text2\nMy text3"; $arr = explode("\n", $str); $array = array(); // inisiasi variable array in format array foreach ($arr as $line) { // loop line by line and convert into array $array[] = $line; }; print_r($array); // display all value echo $array[1]; // diplay index 1
Размещения В Интернете:
body, html, iframe { width: 100% ; height: 100% ; overflow: hidden ; }
<iframe src="https://ideone.com/vE1gst" ></iframe>
этот метод всегда работает на меня:
$uniquepattern="gd$#%@&~#"//Any set of characters which you dont expect to be present in user input $_POST['text'] better use atleast 32 charecters. $textarray=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['text'])));
использование только "базового" пакета также является решением для простых случаев:
> s <- "a\nb\rc\r\nd" > l <- strsplit(s,"\r\n|\n|\r") > l # the whole list... [[1]] [1] "a" "b" "c" "d" > l[[1]][1] # ... or individual elements [1] "a" > l[[1]][2] [1] "b" > fun <- function(x) c('Line content:', x) # handle as you wish > lapply(unlist(l), fun)