2009-09-27 4 views
158

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

Если строка:

My text1
My text2
My text3

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

Array 
(
    [0] => My text1 
    [1] => My text2 
    [2] => My text3 
) 
+1

Я не знаю PHP, но там, как правило, функция называется «сплит» для строк. Он работает следующим образом: array = split (string, "\ n") –

+0

Вы должны сначала нормализовать новые строки. Метод 's ($ yourString) -> normalizeLineEndings()' доступен с https://github.com/delight-im/PHP-Str (библиотека под лицензией MIT), в которой есть много других полезных помощников строк. Вы можете взглянуть на исходный код. – caw

ответ

212

Вы можете использовать функцию 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) 


Обратите внимание, что вы должны использовать double-quoted string, так \n на самом деле интерпретируется как разрыв строки.
(см этой страницы руководства для более подробной информации)

+0

Хотя это просто, вы прекрасно это объяснили. –

+35

Вместо '\ n' вы можете использовать предопределенную константу' PHP_EOL'. – Tim

+32

Все, пожалуйста, будьте осторожны с этим решением, так как оно не работает на всех новых линиях. У меня был наибольший успех с ответом Дэвида. – Maurice

7
explode("\n", $str); 

В "(вместо«) весьма важно, так как в противном случае разрыв строки wouln't интерпретируется.

6
<anti-answer> 

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

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

LF = "\ п" = CHR (10), CR = "\ г" = CHR (13)

</anti-answer> 
3

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

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

с помощью '\ п' не кажется, работает, но Chr (10) работает хорошо: D

надеюсь, что это избавит некоторых от некоторых головных болей.

+0

Привет, Джефф, добро пожаловать в SO. Вы должны переписать это как вопрос и ответ, а не ответ на чужой вопрос. Это сайт вопросов и ответов, а не общий форум. Посмотрите FAQ - http: // stackoverflow.com/faq –

+0

Использование '' \ n'' не работает, потому что escape-последовательности не интерпретируются в одинарных кавычках, вместо этого вам нужно использовать двойные кавычки: '' \ n "' вместо '' n'' Прочитать http://php.net/manual/en/language.types.string.php –

246

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

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

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

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

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

+3

Умный выбор, спасибо! – djule5

+2

Я использовал это, а не принятый ответ и любые другие ответы на эту тему. Просто оставляя этот комментарий как информативный. –

+0

Вы легенда –

233

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

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

(обновлено с окончательным \ г, благодаря @LobsterMan)

+2

Это работало для меня лучше всего. – Maurice

+8

Этот ответ должен быть сверху, а не Паскалем. Это не работало во всех случаях! –

+0

Главный ответ. Большое спасибо – qasimzee

16

Давид: Великое направление, но вы пропустили \ г. это сработало для меня:

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

Спасибо! Неплохо подмечено. Я добавил его в свой код – David

30

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

explode(PHP_EOL,$string) 
+15

Да, но можно редактировать файл или, как в этом примере, запись в db в Windows, например, использовать его в системе Linux. Я думаю, что общий подход будет лучше. – Cranio

+0

Я не уверен, что это правильно. Если текстовая область на веб-странице отправляется, она может иметь разные символы конца строки в зависимости от браузера пользователя, а не от операционной системы сервера. Поэтому независимо от того, какую ОС вы используете, вам нужно будет что-либо разобрать. Это предполагает, что вы делаете веб-материал, конечно. – Magmatic

+0

Затем вы можете использовать 'trim()' в результирующих строках для удаления любых посторонних пробелов. – Tim

-4

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

2

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

\str_getcsv($str,PHP_EOL); 
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 проще и безопаснее (посмотрите на другие ответы). –

2

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

<br />. 

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

Тогда вы можете кормить его в массив:

$array = explode("<br />", $string); 
+0

Примечание: [nl2br] (http://php.net/manual/en/function.nl2br.php) не заменяет разрывы строк ... он только вставляет тег разрыва перед каждой разрывом строки. Таким образом, все ваши элементы массива, отличные от первого, начинаются с разрыва строки. Если это не важно для вас, то этот метод является самым быстрым. Если это имеет значение, [ответ Джакара] (http://stackoverflow.com/a/28725803/1408717) является самым быстрым. – Aust

22

Альтернативой Davids answer который быстрее (так быстрее) заключается в использовании str_replace и explode.

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

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

Я сделал тест на СРК этой страницы и разделить строки 1000 раз в цикле и:
preg_replace принял СРЕДНЕМ 11 секунд
str_replace & explode принял СРЕДНЕМ около 1 второго

Подробнее подробно и bencmark info на my forum

9

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

<?php 

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

?> 

PHP_EOL is a constant holding the line break character(s) used by the server platform.

+3

файл может поступать из другой системы с различными новыми строками, specialry в сетевой среде, для которой используется PHP –

+0

Именно поэтому эта константа существует .. и обрабатывает эту конкретную проблему. – Spooky

+0

Если вы берете файл из окон, он не совпадает с файлом из unix или mac, правильно? –

6

StackOverflow не позволит мне прокомментировать ответ hesselbom (а не достаточно репутации), поэтому я добавляю мои собственные ...

$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY); 

Это работает лучше для меня, потому что он также устраняет ведущий (второй \ с *) и задней (первый \ с *) пробелы автоматически, а также пропускает пустые строки (флаг 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 *. Но, если все, что вы хотите, чтобы разделить на новой линии (как видно из названия), то эта простая (как уже упоминалось Ян Goyvaerts) ...

$array = preg_split('/\R/', $text); 
+0

Модификатор 'm' на самом деле не нужен? Разве это не влияет только на '^' и '$'? – mpen

+0

@mpen Да, я считаю, что вы правы. Я просто перенес его вместе с версией Гесселбома. Я отредактирую свой пост. –

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>

+0

Добавьте несколько объяснений с ответом на вопрос, как этот ответ помогает OP в устранении текущей проблемы –

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) 
Смежные вопросы