Bagaimana saya bisa meletakkan string dalam array, dibagi dengan baris baru?

220

Saya memiliki string dengan jeda baris di database saya. Saya ingin mengubah string itu menjadi sebuah array, dan untuk setiap baris baru, lompat satu tempat indeks dalam array.

Jika stringnya adalah:

My text1
My text2
My text3

Hasil yang saya inginkan adalah ini:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)
Johan
sumber
1
Saya tidak tahu PHP tetapi biasanya ada fungsi yang disebut "split" untuk string. Ini bekerja seperti ini: array = split (string, "\ n")
Sedat Kapanoglu
Anda harus menormalkan baris baru terlebih dahulu, mungkin. Metode s($yourString)->normalizeLineEndings()ini tersedia dengan github.com/delight-im/PHP-Str (perpustakaan di bawah Lisensi MIT) yang memiliki banyak pembantu string berguna lainnya. Anda mungkin ingin melihat kode sumbernya.
gak

Jawaban:

290

Anda dapat menggunakan explodefungsi ini, menggunakan " \n" sebagai pemisah:

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

Misalnya, jika Anda memiliki kode ini:

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

Anda akan mendapatkan hasil ini:

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


Perhatikan bahwa Anda harus menggunakan string yang dikutip ganda , sehingga \nsebenarnya ditafsirkan sebagai garis-istirahat.
(Lihat halaman manual itu untuk lebih jelasnya.)

Pascal MARTIN
sumber
52
Alih-alih \nAnda dapat menggunakan konstanta yang telah ditentukan PHP_EOL.
Tim
40
Semua orang harap berhati-hati dengan solusi ini, karena ini tidak bekerja pada semua baris baru. Saya paling sukses dengan jawaban David
Maurice
1
Anda harus berpisah pada \ n atau \ r untuk dapat menangani semua jenis teks - ini hanya akan bekerja dengan linux & windows newlines. Baris baru Mac akan diabaikan! (r)
Steve Horvath
1
Saya kira jawaban Tim / komentar tidak benar, karena ini hanya akan cocok dengan linebreak sistem ANDA, tetapi ketika Anda mendapatkan string yang memiliki linebreak dari sistem lain itu tidak akan berfungsi! Punya masalah ini dengan email
Asara
7
Tidak jawaban ini dan komentar pada jawaban ini SALAH! Karena ini bukan faktor karakter OS baris baru, terutama tidak PHP_EOL. Anda harus menggunakan preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84
330

Saya selalu menggunakan ini dengan sangat sukses:

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

(diperbarui dengan final, terima kasih @OBsterMan)

David
sumber
11
Jawaban ini harus di atas, bukan di Pascal. Yang itu tidak berfungsi untuk semua kasus.!
Jithesh Kt
1
Ini jawabannya. Yang divalidasi SALAH. Baiklah, hesselbom memilikinya juga ... Anda juga dapat menggunakan ini yang setara: preg_split ('/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); demi kecantikan :) Mengapa ini satu-satunya jawaban yang bagus? Karena Anda tidak dapat mengasumsikan jenis end of line apa yang akan Anda dapatkan: Mac (\ r), Windows (\ r \ n), atau Unix (\ n).
Ninj
2
\R cocok \n , \rdan\r\n
mpen
1
Atau lebih pendek /\r?\n/
Jason Schilling
Contoh ini benar karena Anda tidak bisa hanya mengambil operasi split yang hanya didasarkan pada satu karakter. Jika Anda melakukan itu, memicu pada '\ r' atau '\ n' Anda akan berakhir dengan baris kosong berlebihan jika akhiran Windows "\ r \ n". Dan penting bahwa pemisah Windows dua karakter diuji terlebih dahulu.
AndresRohrAtlasInformatik
281

Jeda baris didefinisikan secara berbeda pada platform yang berbeda, \ r \ n, \ r atau \ n.

Menggunakan RegExp untuk membagi string yang bisa Anda cocokkan ketiganya dengan \ R

Jadi untuk masalah Anda:

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

Itu akan cocok dengan jeda baris pada Windows, Mac dan Linux!

hesselbom
sumber
3
Saya menggunakan ini juga bukan jawaban yang diterima dan jawaban lain di utas ini. Meninggalkan komentar ini sebagai informasi.
Seth Malaki
3
Sebenarnya, ini tidak berhasil untuk saya. Terkadang baris baru masih ada di tombol array.
Maurice
32
Cukup gunakan$array = preg_split ('/\R/', $string);
Jan Goyvaerts
18
Kadang tidak bekerja! preg_split("/\r\n|\n|\r/", $string)pilihan yang lebih baik
Alexey B.
34

PHP sudah mengetahui karakter baris baru sistem saat ini. Cukup gunakan konstanta EOL.

explode(PHP_EOL,$string)
batal
sumber
18
Ya, tetapi seseorang dapat mengedit file atau seperti dalam contoh ini entri db di Windows kemudian menggunakannya pada sistem Linux, misalnya. Saya pikir pendekatan umum akan lebih cocok.
Cranio
Saya tidak yakin ini benar. Jika area teks pada halaman web dikirimkan, itu mungkin memiliki karakter end-of-line yang berbeda tergantung pada browser pengguna, bukan sistem operasi server. Jadi, apa pun OS yang Anda gunakan, Anda harus dapat menguraikan apa pun. Ini dengan asumsi Anda melakukan hal-hal web tentu saja.
Magmatik
Anda mungkin harus menggunakan trim()string yang dihasilkan untuk menghapus spasi kosong yang tidak ada.
Tim
30

Alternatif jawaban Davids yang lebih cepat (lebih cepat) adalah dengan menggunakan str_replacedan explode.

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

Apa yang terjadi adalah:
Karena jeda baris dapat datang dalam bentuk yang berbeda, saya str_replace\ r \ n, \ n \ r, dan \ r dengan \ n sebagai gantinya (dan aslinya \ n dipertahankan).
Kemudian meledak\n dan Anda memiliki semua baris dalam sebuah array.

Saya melakukan patokan pada src halaman ini dan membagi garis 1000 kali dalam for for loop dan:
preg_replacemengambil rata-rata 11 detik
str_replace & explodemengambil rata-rata sekitar 1 detik

Lebih detail dan info bencmark di forum saya

Reed
sumber
Tautan forum Anda (dan seluruh domain) tampaknya turun
Nikita 웃
19

David: Arah yang bagus, tetapi Anda melewatkannya. ini bekerja untuk saya:

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

Anda tidak perlu fungsi preg_ * atau pola preg atau str_replace di dalam, dll. Untuk berhasil memecah string menjadi array oleh baris baru. Dalam semua skenario, baik itu Linux / Mac atau m $, ini akan dilakukan.

<?php 

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

?>

PHP_EOL adalah konstanta yang menahan karakter pemecah baris yang digunakan oleh platform server.

Menyeramkan
sumber
3
file dapat berasal dari sistem lain dengan baris baru yang berbeda, khususnya dalam lingkungan bersih untuk yang digunakan PHP
Luca C.
Itulah alasan konstan ini ada .. dan menangani masalah khusus itu.
Spooky
jika Anda mengambil file dari windows tidak cocok sama dengan file dari unix, atau mac, kan?
Luca C.
Jika Anda menggunakan utf-8 murni sepanjang waktu, di mana saja, file utf8 disertakan, secara normal, dan Anda tidak memiliki apa pun selain PHP_EOL di dalam kode Anda untuk deteksi jeda baris, itu akan dicocokkan seperti yang dijelaskan, dan tidak ada perilaku tak terduga yang akan terjadi. Ingatlah bahwa bukan hanya saya yang berteriak dan mengklaim ini. Kegunaan PHP_EOL cukup dikonfirmasi.
Spooky
1
Dalam kasus Anda, jika sumber berasal dari tempat lain dan tidak terbentuk dengan baik, apa pun, mungkin lebih baik jika Anda menggunakan str_replace (lebih cepat daripada regexp). ... semuanya, baik itu regexp. atau str_replace atau PHP_EOL, ada satu kalimat lama yang bagus yang mengatakan: "Jika berhasil - jangan disentuh!". :)
Spooky
9
explode("\n", $str);

The "(bukannya ') cukup penting karena jika tidak, baris istirahat tidak akan ditafsirkan.

Damien MATHIEU
sumber
9

StackOverflow tidak akan memungkinkan saya untuk mengomentari jawaban hesselbom (tidak cukup reputasi), jadi saya menambahkan sendiri ...

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

Ini bekerja paling baik untuk saya karena juga menghilangkan spasi putih depan (kedua) dan trailing (pertama) secara otomatis dan juga melompati garis kosong (bendera PREG_SPLIT_NO_EMPTY).

- = PILIHAN = -

Jika Anda ingin tetap memimpin spasi putih, cukup singkirkan yang kedua * dan buatlah rtrim () sebagai gantinya ...

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

Jika Anda perlu menjaga baris kosong, singkirkan bendera NULL (itu hanya placeholder) dan PREG_SPLIT_NO_EMPTY, seperti begitu ...

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

Atau menjaga spasi putih dan baris kosong ...

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

Saya tidak melihat alasan mengapa Anda ingin tetap mengikuti spasi, jadi saya sarankan untuk meninggalkan yang pertama di sana. Tapi, jika semua yang Anda inginkan adalah untuk dibagi dengan baris baru (seperti judulnya), ini sederhana (seperti yang disebutkan oleh Jan Goyvaerts) ...

$array = preg_split('/\R/', $text);
Deen Foxx
sumber
The mpengubah tidak benar-benar diperlukan itu? Bukankah itu hanya mempengaruhi ^dan $?
mpen
@ buka Ya, saya yakin Anda benar. Saya hanya membawanya bersama dengan versi hesselbom. Saya akan mengedit posting saya.
Deen Foxx
7
<anti-answer>

Seperti jawaban lain yang telah ditentukan, pastikan untuk menggunakan explodedaripada splitkarena PHP 5.3.0 splitsudah usang. yaitu yang berikut ini BUKAN cara Anda ingin melakukannya:

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

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

</anti-answer>
Tom
sumber
3

Bagi siapa pun yang mencoba menampilkan cronjobs di crontab dan merasa frustrasi tentang cara memisahkan setiap baris, gunakan explode:

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

menggunakan '\ n' tampaknya tidak berfungsi tetapi chr (10) berfungsi dengan baik: D

Semoga ini menyelamatkan seseorang sakit kepala.

Jeff
sumber
Hai Jeff, selamat datang di SO. Anda harus menulis ulang ini sebagai pertanyaan dan jawaban, bukan jawaban atas pertanyaan orang lain. Ini adalah situs tanya jawab, bukan forum umum. Lihat FAQ - stackoverflow.com/faq
Rebecca Scott
Menggunakan '\n'tidak berfungsi karena urutan pelarian tidak ditafsirkan dalam tanda kutip tunggal, Anda harus menggunakan tanda kutip ganda sebagai gantinya: "\n"alih-alih 'n'Baca php.net/manual/en/language.types.string.php
Christopher K.
2

Anda bisa menggunakan ini:

 \str_getcsv($str,PHP_EOL);
parisssss
sumber
2

Anda dapat melakukan $ string = nl2br ($ string) sehingga baris Anda diubah

<br />. 

Dengan cara ini tidak masalah jika sistem menggunakan \ r \ n atau \ n atau \ r

Kemudian Anda bisa memasukkannya ke dalam array:

$array = explode("<br />", $string);
Sandor
sumber
Catatan: nl2br tidak menggantikan jeda baris ... itu hanya menyisipkan tag istirahat sebelum setiap jeda baris. Jadi semua item array Anda selain yang pertama akan dimulai dengan jeda baris. Jika itu tidak masalah bagi Anda, maka metode ini adalah yang tercepat. Jika itu penting, jawaban Jakar adalah yang tercepat.
Aust
2

Itulah cara saya:

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

Ini juga akan melewati semua baris kosong juga.

Axel
sumber
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";
}

array yang benar:

$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

Sematkan Online:

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>

antelove
sumber
Tambahkan beberapa penjelasan dengan jawaban untuk bagaimana jawaban ini membantu OP dalam memperbaiki masalah saat ini
ρяσѕρєя K
1

Ambil ini di dokumen 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
sumber
0

Metode ini selalu berhasil untuk saya:

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

sumber
1
Suka bersumpah sebagai bagian dari kode. :) Bagaimanapun, mengganti dengan \ n lebih sederhana dan lebih aman (lihat jawaban lain).
Stefan Reich
0

Menggunakan hanya paket 'base' juga merupakan solusi untuk kasus-kasus sederhana:

> 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)
Roque
sumber
-6

Menggunakan karakter khusus apa pun antara string atau baris \ndengan menggunakan PHP explode kita dapat mencapai ini.

yasin
sumber