Как я могу поместить строки в массив, разделенные на новую строку?

220

У меня есть строка с разрывами строк в моей базе данных. Я хочу преобразовать эту строку в массив, и для каждой новой строки переходить на одно место индекса в массиве.

Если строка:

My text1
My text2
My text3

В результате я хочу это:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)
Johan
источник
1
Я не знаю PHP, но обычно есть функция под названием «split» для строк. Это работает так: array = split (string, "\ n")
Седат Капаноглу
Вы должны сначала нормализовать переводы строки, вероятно. Этот метод s($yourString)->normalizeLineEndings()доступен с github.com/delight-im/PHP-Str (библиотека под лицензией MIT), в которой есть много других полезных помощников строк. Возможно, вы захотите взглянуть на исходный код.
caw

Ответы:

290

Вы можете использовать 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фактически интерпретируется как разрыв строки.
(См. Эту страницу руководства для более подробной информации.)

Паскаль МАРТИН
источник
52
Вместо этого \nвы можете использовать предопределенную константу PHP_EOL.
Тим
40
Все, пожалуйста, будьте осторожны с этим решением, так как оно работает не на всех новых строках. У меня был наибольший успех с ответом Дэвида
Морис
1
Вы должны разделиться на \ n или \ r, чтобы иметь возможность обрабатывать все виды текстов - это будет работать только с новыми строками Linux и Windows. Новые строки Mac будут игнорироваться! (r)
Стив Хорват
1
Я думаю, что Тим / ответ / комментарий не верны, потому что это будет соответствовать переводу строки только ВАШЕЙ системе, но когда вы получите строки, содержащие разрывы строк из других систем, это не сработает! Была эта проблема с электронными письмами
Асара
7
Нет этого ответа, и комментарии к этому ответу НЕПРАВИЛЬНЫ! Потому что это не учитывает символ новой строки ОС, особенно нет PHP_EOL. Вы должны использовать preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84
331

Я всегда использовал это с большим успехом:

$array = preg_split("/\r\n|\n|\r/", $string);

(дополнено финальной версией, спасибо @LobsterMan)

Дэвид
источник
11
Этот ответ должен быть сверху вместо Паскаля. Это не работает во всех случаях.!
Jithesh Kt
1
Это ответ. Утвержденный является НЕПРАВИЛЬНЫМ. Ну, у Хессельбома это тоже есть ... Вы также можете использовать этот эквивалент: preg_split ('/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); ради красоты :) Почему это единственный хороший ответ? Потому что вы не можете предположить, какой тип конца строки вы получите: Mac (\ r), Windows (\ r \ n) или Unix (\ n).
Ninj
2
\R матчей \n , \rи\r\n
mpen
1
Или короче/\r?\n/
Джейсон Шиллинг
Этот пример верен, потому что вы не можете просто выполнить любую операцию разбиения, основанную только на одном символе. Если вы сделаете это, вызывая '\ r' или '\ n', вы получите лишнюю пустую строку в случае окончания "\ r \ n" Windows. И важно, чтобы сначала был протестирован двухсимвольный разделитель Windows.
AndresRohrAtlasInformatik
281

Разрыв строки определяется по-разному на разных платформах, \ r \ n, \ r или \ n.

Используя RegExp для разделения строки, вы можете сопоставить все три с \ R

Итак, для вашей проблемы:

$array = preg_split ('/$\R?^/m', $string);

Это будет соответствовать разрывам строк в Windows, Mac и Linux!

hesselbom
источник
3
Я использовал это также вместо принятого ответа и любых других ответов в этой теме. Просто оставив этот комментарий как информативный.
Сет Малаки
3
На самом деле, это не сработало для меня. Иногда новые строки, где все еще присутствуют в ключах массива.
Морис
32
Просто используйте$array = preg_split ('/\R/', $string);
Ян Goyvaerts
18
Иногда не работает! preg_split("/\r\n|\n|\r/", $string)лучший выбор
Алексей Б.
34

PHP уже знает символы новой строки текущей системы. Просто используйте константу EOL.

explode(PHP_EOL,$string)
voidstate
источник
18
Да, но можно отредактировать файл или, как в этом примере, запись db в Windows, а затем использовать ее, например, в системе Linux. Я думаю, что общий подход подойдет лучше.
Cranio
Я не уверен, что это правильно. Если текстовая область на веб-странице отправляется, она может содержать разные символы конца строки в зависимости от браузера пользователя, а не операционной системы сервера. Поэтому независимо от того, какую операционную систему вы используете, вам нужно будет уметь анализировать что угодно. Конечно, это предполагает, что вы занимаетесь веб-вещанием.
Magmatic
Затем вам, возможно, придется использовать trim()полученные строки для удаления любых посторонних пробелов.
Тим
30

Альтернативой ответу Дэвидса, который быстрее (намного быстрее), является использование str_replaceи explode.

$arrayOfLines = explode("\n",
                    str_replace(["\r\n","\n\r","\r"],"\n",$str)
            );

Происходит следующее:
Так как разрывы строк могут иметь различную форму, str_replaceвместо этого I \ r \ n, \ n \ r и \ r с \ n (и оригинальные \ n сохраняются).
Затем взорвитесь, \nи вы получите все строки в массиве.

Я сделал бенчмарк на src этой страницы и разделил строки 1000 раз в цикле for и:
preg_replaceзанял среднее значение 11 секунд
str_replace & explodeзанял среднее значение около 1 секунды

Более подробная информация и информация о тесте на моем форуме

камыш
источник
Ваша ссылка на форуме (и весь домен), кажется, не работает
Никита 웃
19

Дэвид: Отличное направление, но ты пропустил. это сработало для меня:

$array = preg_split("/(\r\n|\n|\r)/", $string);
LobsterMan
источник
11

Вам не нужны ни preg_ * -функции, ни preg-шаблоны, ни str_replace внутри и т. Д., Чтобы успешно разбить строку на массив с помощью новых строк. Во всех сценариях, будь то Linux / Mac или m $, это подойдет.

<?php 

 $array = explode(PHP_EOL, $string);
 // ...  
 $string = implode(PHP_EOL, $array);

?>

PHP_EOL - это константа, содержащая символы переноса строк, используемые платформой сервера.

Ужасный
источник
3
файл может быть получен из другой системы с другими новыми строками, особенно в сетевой среде, для которой используется PHP
Luca C.
Именно поэтому эта константа существует ... и решает эту конкретную проблему.
Жуткий
Если вы берете файл из Windows, он не совпадает с файлом из Unix или Mac, верно?
Лука С.
Если вы используете чистый utf-8 постоянно, везде, включая файлы utf8, как правило, и у вас нет ничего, кроме PHP_EOL внутри вашего кода для обнаружения разрыва строки, он будет соответствовать описанному, и непредвиденное поведение не произойдет. Имейте в виду, что это не только я кричу и требую это. Удобство использования PHP_EOL вполне подтверждено.
Жуткий
1
В вашем случае, если источники приходят откуда-то еще и не сформированы должным образом, возможно, будет лучше, если вы используете str_replace (быстрее, чем регулярное выражение). ... в целом, будь то регулярное выражение. или str_replace или PHP_EOL, есть одно хорошее старое предложение, говорящее: «Если это работает - не трогайте это!». :)
Жуткий
9
explode("\n", $str);

«(Вместо») очень важно, так как в противном случае разрыв строки не будет интерпретирован.

Дэмиен Мэтью
источник
9

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);
Дин Фокс
источник
mМодификатор действительно не нужен он? Разве это не влияет только на ^и $?
mpen
@mpen Да, я верю, что ты прав. Я просто отнес его с версией Хессельбома. Я отредактирую свой пост.
Дин Фокс
7
<anti-answer>

Как указали другие ответы, обязательно используйте, explodeа не splitпотому, что с PHP 5.3.0 splitустарела. то есть следующее НЕ так, как вы хотите это сделать:

$your_array = split(chr(10), $your_string);

LF = "\ n" = chr (10), CR = "\ r" = chr (13)

</anti-answer>
Том
источник
3

Для тех, кто пытается отобразить cronjobs в crontab и разочарован тем, как разделить каждую строку, используйте explode:

$output = shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);

использование '\ n', похоже, не работает, но chr (10) работает хорошо: D

надеюсь, это спасет кого-то от головной боли.

Джефф
источник
Привет Джефф, добро пожаловать на ТАК. Вы должны переписать это как вопрос и ответ, а не как ответ на чужой вопрос. Это сайт вопросов и ответов, а не общий форум. Загляните в FAQ - stackoverflow.com/faq
Ребекка Скотт
Использование '\n'не работает, потому что escape-последовательности не интерпретируются в одинарных кавычках, вместо "\n"этого вам нужно использовать двойные кавычки: вместо 'n'Read php.net/manual/en/language.types.string.php
Кристофер К.
2

Вы можете использовать это:

 \str_getcsv($str,PHP_EOL);
parisssss
источник
2

Вы можете сделать $ string = nl2br ($ string), чтобы ваш перевод строки был изменен на

<br />. 

Таким образом, не имеет значения, использует ли система \ r \ n или \ n или \ r

Затем вы можете передать его в массив:

$array = explode("<br />", $string);
Шандор
источник
Примечание: nl2br не заменяет разрывы строк ... он только вставляет тег разрыва перед каждым разрывом строки. Таким образом, все элементы массива, кроме первого, будут начинаться с разрыва строки. Если это не имеет значения для вас, то этот метод самый быстрый. Если это имеет значение, ответ Джакара самый быстрый.
Ост
2

Это мой путь:

$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);

Это также пропустит все пустые строки.

Axel
источник
1
$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>

antelove
источник
Добавьте некоторое объяснение с ответом о том, как этот ответ помогает ОП в исправлении текущей проблемы
ρяσѕρєя K
1

Поднял это в документах 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);
?>
korwalskiy
источник
0

Этот метод всегда работает для меня:

$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'])));

источник
1
Люблю ругаться как часть кода. :) В любом случае, замена на \ n проще и безопаснее (посмотрите на другие ответы).
Стефан Райх
0

Использование только базового пакета также является решением для простых случаев:

> 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)
Роке
источник
-6

Используя любой специальный символ между строкой или разрывом строки, \nиспользуя PHP разнесение, мы можем достичь этого.

Ясин
источник