Jak umieścić string w tablicy, podzielonej przez nową linię?

Mam w bazie danych ciąg znaków z podziałem na linie. Chcę przekonwertować ten łańcuch na tablicę i dla każdej nowej linii przeskakiwać o jedno miejsce indeksu w tablicy.

Jeśli łańcuch jest:

Mój tekst1
Mój tekst2
Mój tekst3

Wynik jaki chcę jest taki:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)
Author: TRiG, 2009-09-27

18 answers

Możesz użyć explode funkcja, używając" \n " jako separatora:

$your_array = explode("\n", $your_string_from_db);

Na przykład, jeśli masz ten fragment kodu:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);

Otrzymałbyś to wyjście:

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)


Zauważ, że musisz użyć podwójnego cytowanego ciągu , więc {[4] } jest faktycznie interpretowane jako łamanie linii.
(więcej szczegółów na tej stronie podręcznika)

 235
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-27 12:31:37

Podział linii jest różnie definiowany na różnych platformach, \r \ n, \ R lub \N.

Używając RegExp do podzielenia ciągu można dopasować wszystkie trzy za pomocą \r

Więc dla Twojego problemu:

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

Pasowałoby to do podziałów linii w systemach Windows, Mac i Linux!

 259
Author: hesselbom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-21 11:22:40

Zawsze używałem tego z wielkim powodzeniem:

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

(Aktualizacja z finałem \r, dzięki @ LobsterMan)

 255
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-07 12:20:54

PHP zna już znaki nowej linii bieżącego systemu. Użyj stałej EOL.

explode(PHP_EOL,$string)
 32
Author: voidstate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 12:32:44

Alternatywą dla odpowiedzi Davids , która jest szybsza (o wiele szybsza), jest użycie str_replace i explode.

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

Co się dzieje to:
Ponieważ podziały linii mogą mieć różne formy, I str_replace \R \ n, \n \ r i \R Z \ N zamiast (i oryginalne \n są zachowane).
Następnie eksploduj na {[4] } i masz wszystkie linie w tablicy.

Zrobiłem benchmark na src tej strony i podzieliłem linie 1000 razy w pętli for I:
preg_replace zajęło avg 11 sekund
str_replace & explode wziął avg około 1 sekundy

Więcej szczegółów i informacji na moje forum

 24
Author: Jakar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:26

[[1]} David: świetny kierunek, ale przegapiłeś \r. u mnie to działało:

$array = preg_split("/(\r\n|\n|\r)/", $string);
 17
Author: LobsterMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 13:05:32
explode("\n", $str);

"(zamiast") jest dość ważne, ponieważ w przeciwnym razie przerwa linii nie zostałaby zinterpretowana.

 9
Author: Damien MATHIEU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-27 12:31:42

Nie potrzebujesz funkcji preg_ * ani wzorców preg, ani str_replace, itp .. aby pomyślnie podzielić łańcuch znaków na tablicę za pomocą nowych linii. We wszystkich scenariuszach, czy to Linux/Mac czy m$, to wystarczy.

<?php 

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

?>

PHP_EOL jest stałą utrzymującą znaki podziału linii używane przez platformę serwerową.

 9
Author: Spooky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-09 22:32:59
<anti-answer>

Jak podały inne odpowiedzi, upewnij się, że używasz explode zamiast split, ponieważ PHP 5.3.0 split jest przestarzałe. tzn. poniżej jest a nie tak jak chcesz to zrobić:

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

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

</anti-answer>
 7
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-17 12:41:56

StackOverflow nie pozwoli mi skomentować odpowiedzi hesselboma (za mało reputacji), więc dodaję własną...

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

To działało najlepiej dla mnie, ponieważ eliminuje automatycznie początkowe (second \s*) i końcowe (first \s*) białe znaki, a także pomija puste linie (znacznik PREG_SPLIT_NO_EMPTY).

- = opcje = -

Jeśli chcesz zachować wiodącą spację, po prostu pozbądź się drugiej \s* i zrób z niej rtrim ()...

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

Jeśli potrzebujesz zachowaj puste linie, pozbądź się znacznika NULL (jest to tylko symbol zastępczy) I znacznika PREG_SPLIT_NO_EMPTY, w ten sposób...

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

Lub zachowanie zarówno pierwszych białych, jak i pustych linii...

$array = preg_split('/\s*\R/', rtrim($text));

Nie widzę powodu, dla którego chcielibyście w ogóle ciągnąć za sobą białe znaki, więc sugeruję pozostawienie tam pierwszego \s*. Ale jeśli wszystko, co chcesz, to podzielić przez nową linię (jak sugeruje tytuł), jest to proste (jak wspomniał Jan Goyvaerts)...

$array = preg_split('/\R/', $text);
 7
Author: Deen Foxx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-10 17:28:20

Dla każdego, kto próbuje wyświetlić cronjobs w crontabie i denerwuje się, jak oddzielić każdą linię, użyj explode:

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

Using '\n 'doesn' t seem to work but chr(10) works nice: D

Mam nadzieję, że to uratuje komuś ból głowy.
 3
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-13 06:36:23

Możesz użyć tego:

 \str_getcsv($str,PHP_EOL);
 2
Author: parisssss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-01 11:00:28

Możesz zrobić $string = nl2br ($string) tak, że twój podział linii zostanie zmieniony na

<br />. 

W ten sposób nie ma znaczenia, czy system używa \r\n lub \n lub \R

Następnie możesz wprowadzić go do tablicy:

$array = explode("<br />", $string);
 2
Author: Sandor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-13 00:02:55
$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";
}

True array:

$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

Embed Online:

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>
 1
Author: antelove,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-25 06:37:02

Ta metoda zawsze działa dla mnie:

$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'])));
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-19 03:09:33

Używanie tylko pakietu' base ' jest również rozwiązaniem dla prostych przypadków:

> 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)
 0
Author: Roque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-02 18:11:56

Podałem to w PHP docs:

<?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);
?>
 0
Author: korwalskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-29 07:44:56

Używając dowolnego znaku specjalnego pomiędzy łańcuchem lub linią \n używając PHP explode możemy to osiągnąć.

 -4
Author: yasin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-13 12:54:06