web-dev-qa-db-fra.com

Comment mettre une chaîne dans un tableau, divisé par une nouvelle ligne?

J'ai une chaîne avec des sauts de ligne dans ma base de données. Je veux convertir cette chaîne en tableau, et pour chaque nouvelle ligne, sauter d'un index dans le tableau.

Si la chaîne est:

Mon texte1
Mon text2
Mon texte3

Le résultat que je veux est le suivant:

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

Vous pouvez utiliser la fonction explode en utilisant "\n" comme séparateur:

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

Par exemple, si vous avez ce morceau de code:

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

Vous obtiendrez cette sortie:

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


Notez que vous devez utiliser une chaîne entre guillemets doubles , donc \n est interprété comme un saut de ligne ...
(voir cette page de manuel pour plus de détails)

246
Pascal MARTIN

J'ai toujours utilisé cela avec beaucoup de succès:

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

(mis à jour avec la version finale, merci @LobsterMan)

274
David

Un saut de ligne est défini différemment sur différentes plates-formes,\r\n,\r ou\n.

En utilisant RegExp pour scinder la chaîne, vous pouvez faire correspondre les trois avec\R

Donc pour votre problème:

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

Cela correspondrait aux sauts de ligne sous Windows, Mac et Linux!

271
hesselbom

PHP connaît déjà le caractère de nouvelle ligne du système actuel. Il suffit d'utiliser la constante EOL.

explode(PHP_EOL,$string)
32
voidstate

Une alternative à Davids answer qui est plus rapide (beaucoup plus rapide) consiste à utiliser str_replace et explode.

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

Ce qui se passe c'est:
Les sauts de ligne pouvant prendre différentes formes, je str_replace\r\n,\n\r et\r avec\n à la place (\ n et le\n sont préservés).
Puis exploser sur \n et vous avez toutes les lignes d’un tableau.

J'ai fait un point de repère sur le src de cette page et divisé les lignes 1000 fois dans une boucle for et:
preg_replace a pris une moyenne de 11 secondes
str_replace & explode a pris une moyenne d'environ 1 seconde

Plus de détails et d'informations sur Bencmark sur mon forum

26
Reed

David: Super direction, mais vous avez manqué. cela a fonctionné pour moi:

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

Vous n'avez pas besoin de fonctions preg_ *, ni de patterns de preg, ni de str_replace dans, etc. Dans tous les scénarios, que ce soit Linux/Mac ou m $, cela conviendra. 

<?php 

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

?>

PHP_EOL est une constante contenant le ou les caractères de saut de ligne utilisés par la plate-forme du serveur.

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

Le "(au lieu de ') est assez important, sinon le saut de ligne ne serait pas interprété.

9
Damien MATHIEU
<anti-answer>

Comme d'autres réponses l'ont précisé, veillez à utiliser explode plutôt que split car à partir de PHP 5.3.0 split est obsolète. Ce qui suit estPASla façon dont vous voulez le faire:

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

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

</anti-answer>
7
Tom

StackOverflow ne me permet pas de commenter la réponse de hesselbom (réputation insuffisante), alors j'ajoute la mienne ...

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

Cela a fonctionné au mieux pour moi, car cela élimine automatiquement les espaces blancs de début (deuxième) et de fin (premier), tout en ignorant les lignes vides (le drapeau PREG_SPLIT_NO_EMPTY).

- = OPTIONS = -

Si vous voulez rester en tête, supprimez simplement le second\s * et faites-en un rtrim () à la place ...

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

Si vous devez conserver des lignes vides, supprimez les indicateurs NULL (il ne s'agit que d'un espace réservé) et PREG_SPLIT_NO_EMPTY, comme si ...

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

Ou garder les deux espaces et les lignes vides ...

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

Je ne vois aucune raison pour laquelle vous voudrez peut-être conserver les espaces, alors je suggère de laisser le premier\s * dedans. Mais si tout ce que vous voulez, c'est diviser par une nouvelle ligne (comme le titre l'indique), c'est CE simple (comme l'a mentionné Jan Goyvaerts) ...

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

Pour tous ceux qui essaient d'afficher des tâches dans une crontab et qui sont frustrés par la séparation de chaque ligne, utilisez exploser: 

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

utiliser '\ n' ne semble pas fonctionner mais chr (10) fonctionne bien: D

j'espère que cela sauvera des maux de tête à quelqu'un.

3
Jeff

Vous pouvez faire un $ string = nl2br ($ string) pour que votre saut de ligne soit changé en 

<br />. 

De cette façon, peu importe que le système utilise\r\n ou\n ou\r

Ensuite, vous pouvez le nourrir dans un tableau:

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

vous pouvez utiliser ceci:

 \str_getcsv($str,PHP_EOL);
2
parisssss

Ramassé ceci dans les documents 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";
}

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

Intégrer en ligne:

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

1
antelove

Utiliser uniquement le package 'base' est également une solution pour les cas 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)
0
Roque

Cette méthode fonctionne toujours pour moi:

$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

C'est ma façon:

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

Cela évitera également toutes les lignes vides.

0
Axel