Как поместить строку в массив, разделенную новой строкой?
-
18-09-2019 - |
Вопрос
В моей базе данных есть строка с разрывами строк.Я хочу преобразовать эту строку в массив и для каждой новой строки переходить на одну позицию индекса в массиве.
Если строка:
Мой текст1
Мой текст2
Мой текст3
Результат, который я хочу, таков:
Array
(
[0] => My text1
[1] => My text2
[2] => My text3
)
Решение
Вы можете использовать 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
на самом деле интерпретируется как разрыв строки.
(более подробную информацию см. на этой странице руководства)
Другие советы
Я всегда использовал это с большим успехом:
$array = preg_split("/\r\n|\n|\r/", $string);
(обновлено с последним , спасибо @LobsterMan)
Разрыв строки определяется по-разному на разных платформах: , или .
Используя RegExp для разделения строки, вы можете сопоставить все три с помощью
Итак, для вашей проблемы:
$array = preg_split ('/$\R?^/m', $string);
Это будет соответствовать разрывам строк в Windows, Mac и Linux!
PHP уже знает символы новой строки текущей системы.Просто используйте константу EOL.
explode(PHP_EOL,$string)
Альтернатива Ответ Дэвидса что быстрее (намного быстрее) - использовать str_replace
и explode
.
$arrayOfLines = explode("\n",
str_replace(array("\r\n","\n\r","\r"),"\n",$str)
);
Что происходит:
Поскольку разрывы строк могут иметь разную форму, я str_replace
,
и
с
вместо этого (при этом исходный
сохраняется).
Затем взорвать \n
и у вас есть все строки в массиве.
Я провел тест на src этой страницы и разделил строки 1000 раз в цикле for и:
preg_replace
заняло в среднем 11 секунд
str_replace & explode
заняло в среднем около 1 секунды
Более подробная информация и информация о тестах на мой форум
Дэйвид:Отличное направление, но вы пропустили .это сработало для меня:
$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 — константа, содержащая символы разрыва строки, используемые серверной платформой.
StackOverflow не позволит мне комментировать ответ Хессельбома (недостаточно репутации), поэтому я добавляю свой собственный...
$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);
Это сработало лучше всего для меня, потому что оно также автоматически устраняет начальные (второй \s*) и конечные (первый \s*) пробелы, а также пропускает пустые строки (флаг PREG_SPLIT_NO_EMPTY).
-= ОПЦИИ =-
Если вы хотите сохранить пробелы в начале, просто избавьтесь от второго \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);
<anti-answer>
Как указано в других ответах, обязательно используйте explode
скорее, чем split
потому что начиная с PHP 5.3.0 split
не рекомендуется.то естьследующее НЕТ как вы хотите это сделать:
$your_array = split(chr(10), $your_string);
LF = " " = chr(10), CR = " " = chr(13)
</anti-answer>
Для тех, кто пытается отобразить задания cron в crontab и не понимает, как разделить каждую строку, используйте взорвать:
$output = shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);
использование ' ', похоже, не работает, но chr(10) работает хорошо: D
надеюсь, это избавит кого-то от головной боли.
вы можете использовать это:
\str_getcsv($str,PHP_EOL);
Вы можете сделать $string = nl2br($string), чтобы разрыв строки был изменен на
<br />.
Таким образом, не имеет значения, использует ли система или или .
Затем вы можете передать его в массив:
$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>
Подобрал это в документации php:
<?php
// split the phrase by any number of commas or space characters,
// which include " ", \r, \t, \n and \f
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
?>
У меня всегда работает этот метод:
$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)
Это мой путь:
$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);
Это также пропустит все пустые строки.
Использование любого специального символа между строкой или разрывом строки \n
используя PHP взрыв, мы можем добиться этого.