Como colocar string no array, dividida por nova linha?
-
18-09-2019 - |
Pergunta
Eu tenho uma string com quebras de linha em meu banco de dados. Eu quero converter essa string em uma matriz, e para cada nova linha, saltar lugar um índice na matriz.
Se a string é:
Meu text1
Meu text2
Meu text3
O resultado que eu quero é o seguinte:
Array
(
[0] => My text1
[1] => My text2
[2] => My text3
)
Solução
Você pode usar a função explode
, usando "\n
" como separador:
$your_array = explode("\n", $your_string_from_db);
Por exemplo, se você tem este pedaço de código:
$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);
Você deseja obter esta saída:
array
0 => string 'My text1' (length=8)
1 => string 'My text2' (length=8)
2 => string 'My text3' (length=8)
Note que você tem que usar um duplo citou corda , então \n
é realmente interpretado como uma linha-break.
(veja a página manual para mais detalhes)
Outras dicas
Eu sempre usei isso com grande sucesso:
$array = preg_split("/\r\n|\n|\r/", $string);
(atualizado com a final \ r, graças @LobsterMan)
Uma quebra de linha é definido de forma diferente em diferentes plataformas, \ r \ n, \ r ou \ n.
Usando RegExp para dividir a seqüência que você pode combinar todos os três com \ R
Assim, para o seu problema:
$array = preg_split ('/$\R?^/m', $string);
Isso iria coincidir com quebras de linha em Windows, Mac e Linux!
PHP já sabe caractere de nova linha do sistema atual (s). Basta usar a constante EOL.
explode(PHP_EOL,$string)
Uma alternativa para Davids resposta que é mais rápido (forma mais rápida) é a utilização str_replace
e explode
.
$arrayOfLines = explode("\n",
str_replace(array("\r\n","\n\r","\r"),"\n",$str)
);
O que está acontecendo é:
Desde quebras de linha pode vir em diferentes formas, eu str_replace
\ r \ n \ n \ r e \ r com \ n vez (e original \ n são preservados).
Em seguida, explodir em \n
e você tem todas as linhas em uma matriz.
Eu fiz uma referência no src desta página e dividir as linhas de 1000 vezes em um loop e:
preg_replace
levou uma média de 11 segundos
str_replace & explode
levou uma média de cerca de 1 segundo
Mais detalhes e informações bencmark em meu fórum
David: Grande direção, mas você perdeu o \ r. Isso funcionou para mim:
$array = preg_split("/(\r\n|\n|\r)/", $string);
explode("\n", $str);
A "(em vez de ') é muito importante, caso contrário, a quebra de linha wouln't se interpretado.
Você não precisa preg_ * funções nem padrões preg nem str_replace dentro, etc .., a fim de sucessfuly quebrar uma string em conjunto por novas linhas. Em todos os cenários, seja Linux / Mac ou m $, isso vai fazer.
<?php
$array = explode(PHP_EOL, $string);
// ...
$string = implode(PHP_EOL, $array);
?>
PHP_EOL é uma constante segurando o personagem quebra de linha (s) utilizado pela plataforma de servidor.
StackOverflow não vai permitir-me a comentar sobre a resposta de hesselbom (reputação não o suficiente), então eu estou adicionando meu próprio ...
$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);
Isso funcionou melhor para mim, porque ele também elimina líder (segunda \ s *) e à direita (primeira \ s *) espaços em branco automaticamente e também ignora linhas em branco (a bandeira PREG_SPLIT_NO_EMPTY).
- = OPÇÕES = -
Se você quiser manter os espaços em branco, simplesmente se livrar da segunda \ s * e torná-lo um rtrim () em vez ...
$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);
Se você precisa manter linhas vazias, se livrar do NULL (que é apenas um espaço reservado) e bandeira PREG_SPLIT_NO_EMPTY, como assim ...
$array = preg_split('/\s*\R\s*/', trim($text));
Ou mantendo ambos os espaços em branco e vazio linhas principais ...
$array = preg_split('/\s*\R/', rtrim($text));
Eu não vejo nenhuma razão pela qual você alguma vez quiser manter espaços em branco, então eu sugiro deixando o primeiro \ s * lá. Mas, se tudo que você quer é dividida pela nova linha (como o título sugere), é este simples (como mencionado por Jan Goyvaerts) ...
$array = preg_split('/\R/', $text);
<anti-answer>
Como outras respostas especificou, certifique-se de explode
uso ao invés de split
porque a partir do PHP 5.3.0 split
está obsoleta. ou seja, o seguinte é não do jeito que você quiser fazê-lo:
$your_array = split(chr(10), $your_string);
LF = "\ n" = CHR (10), CR = "\ r" = CHR (13)
</anti-answer>
Para qualquer um que tenta cronjobs exibição em um crontab e ficando frustrados sobre como separar cada linha, o uso explodir:
$output = shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);
usando '\ n' não parece trabalho, mas chr (10) funciona muito bem: D
espero que isso economiza cerca de um algumas dores de cabeça.
Você pode usar o seguinte:
\str_getcsv($str,PHP_EOL);
Você pode fazer uma $ string = nl2br ($ string) para que sua quebra de linha é alterado para
<br />.
Desta forma, não importa se o sistema usa \ r \ n ou \ n ou \ r
Em seguida, você pode alimentá-lo em uma matriz:
$array = explode("<br />", $string);
$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 on-line:
body, html, iframe {
width: 100% ;
height: 100% ;
overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>
Colhidos este se nos docs 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);
?>
Este método sempre funciona para mim:
$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'])));
Usando apenas o pacote 'base' é também uma solução para casos simples:
> 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)
Essa é a minha maneira:
$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);
Isso também irá ignorar todas as linhas vazias também.
O uso de qualquer caractere especial entre a corda ou linha de quebra \n
usando PHP explode podemos alcançar este objectivo.