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
)
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)
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!
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)
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)
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 sekundstr_replace & explode
wziął avg około 1 sekundy
Więcej szczegółów i informacji na moje forum
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);
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.
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ą.
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>
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);
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.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);
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);
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>
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'])));
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)
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);
?>
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ąć.
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