web-dev-qa-db-ja.com

新しい行で分割された、文字列を配列に配置する方法

データベースに改行を含む文字列があります。その文字列を配列に変換し、新しい行ごとに配列内のインデックス位置を1つジャンプします。

文字列が

私のテキスト1
私のテキスト2
私のテキスト3

私が欲しい結果はこれです:

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

区切り文字として "\n"を使用して、 explode 関数を使用できます。

$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は実際には改行として解釈されます。
(詳細についてはそのマニュアルページを参照してください)

252
Pascal MARTIN

私はいつもこれを大成功で使っています:

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

(最後の\ rで更新、ありがとう@LobsterMan)

285
David

改行はプラットフォームによって異なります。\ r\n、\ r、または\ n。

RegExpを使用して文字列を分割すると、3つすべてを\ Rで一致させることができます。

だからあなたの問題のために:

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

それは、Windows、Mac、Linuxでの改行と一致します。

274
hesselbom

PHPは現在のシステムの改行文字を既に知っています。 EOL定数を使うだけです。

explode(PHP_EOL,$string)
33
voidstate

Davids answer よりも速い(はるかに速い)の代替は、str_replaceexplodeを使用することです。

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

何が起こっているのですか:
改行はさまざまな形式で表示される可能性があるため、代わりに\ nを使用して_ str_replace\r\n、\ n\r、および\ rとします(元の\ nは保持されます)。
それから\nを爆発させると、すべての行が配列になります。

このページのsrcでベンチマークを行い、forループで行を1000回分割しました。
preg_replaceの平均時間は11秒でした
str_replace & explodeの平均時間は約1秒です

私のフォーラム に関する詳細およびベンチマーク情報

27
Reed

David:素晴らしい方向だが、逃した。これは私のために働いた:

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

改行で文字列を配列に分割するために、preg_ *関数、pregパターン、str_replaceなどは必要ありません。すべてのシナリオで、それがLinux/Macまたはm $であろうと、これはうまくいくでしょう。

<?php 

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

?>

PHP_EOLはサーバプラットフォームで使用される改行文字を保持する定数です。

9
Spooky
explode("\n", $str);

「(の代わりに)は、そうでなければ改行が解釈されないので非常に重要です。

9
Damien MATHIEU
<anti-answer>

他の回答でも指定されているように、PHP 5.3.0以降のexplodeは推奨されないため、splitではなくsplitを必ず使用してください。つまり、次はNOTあなたがやりたいやり方です:

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

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

</anti-answer>
7
Tom

StackOverflowは私がhesselbomの答えについてコメントすることを可能にしないでしょう(十分でない評判)、それで私は私自身を追加しています...

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

先頭(2番目の\ s *)と末尾(1番目の\ s *)の空白も自動的に削除され、空白行もスキップされるので(PREG_SPLIT_NO_EMPTYフラグ)、これは私には最適です。

- =オプション= -

先頭の空白を残したい場合は、2番目の\ 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 *をそこに残すことをお勧めします。しかし、あなたが望むすべてが(タイトルが示唆するように)新しい行で分割することであるならば、それは(Jan Goyvaertsによって言及されるように)これは単純です...

$array = preg_split('/\R/', $text);
7
Deen Foxx

Crontabにcronjobを表示しようとしていて各行を分ける方法にいらいらしている人は、explodeを使用してください。

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

'\ n'を使ってもうまくいかないようですが、chr(10)はうまく動作します:D

これで頭痛が解消されることを願っています。

3
Jeff

改行がに変更されるように$ string = nl2br($ string)を実行できます。

<br />. 

この方法では、システムが\ r\nを使用しても\ nまたは\ rを使用しても問題ありません。

それからそれを配列に入れることができます。

$array = explode("<br />", $string);
2
Sandor

あなたはこれを使用することができます:

 \str_getcsv($str,PHP_EOL);
2
parisssss

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);
?>
1
korwalskiy
$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>
1
antelove

'base'パッケージのみを使用することも簡単な場合の解決策です。

> 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
Roque

この方法はいつも私のために働きます:

$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
user2533777

それが私のやり方だ:

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

これもすべての空行をスキップします。

0
Axel