Як я можу вставити рядки в масив, розділений на новий рядок?


220

У моїй базі даних є рядок з розривами рядків. Я хочу перетворити цей рядок у масив, і для кожного нового рядка перескочіть одне індексне місце у масиві.

Якщо рядок:

My text1
My text2
My text3

Я хочу цього:

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

1
Я не знаю PHP, але зазвичай існує функція, що називається "split" для рядків. Він працює так: array = split (рядок, "\ n")
Sedat Kapanoglu

Слід спочатку нормалізувати нові рядки, напевно. Метод s($yourString)->normalizeLineEndings()доступний за допомогою github.com/delight-im/PHP-Str (бібліотека під ліцензією MIT), яка має безліч інших корисних допоміжних рядків. Ви можете поглянути на вихідний код.
каре

Відповіді:


291

Ви можете використовувати explodeфункцію, використовуючи " \n" як роздільник:

$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він насправді трактується як розрив рядка.
(Докладнішу інформацію див. На цій сторінці керівництва.)


52
Замість \nвас можна використовувати заздалегідь задану константу PHP_EOL.
Тім

40
Всі будь ласка, будьте обережні з цим рішенням, оскільки воно працює не у всіх нових рядках. Я мав найбільший успіх у відповіді Девіда
Моріс

1
Ви можете розділити або \ n або \ r, щоб мати можливість обробляти всі види текстів - це працюватиме лише з новими рядками Linux та Windows. Нові рядки Mac не враховуються! (\ r)
Стів Хорват

1
Я думаю, що відповідь / коментар Тімса не правильний, тому що це буде відповідати лише лінії ВАШОЇ системи, але коли ви отримуєте рядки, які мають переривання рядків у інших систем, це не буде працювати! У вас виникли проблеми з електронними листами
Асара

7
Немає цієї відповіді та коментарі до цієї відповіді НЕПРАВНИ! Тому що це не враховує характер нової лінії ОС, особливо ні PHP_EOL. Ви повинні використовувати preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84

331

Я завжди користувався цим з великим успіхом:

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

(оновлено з фіналом, дякую @LobsterMan)


11
Ця відповідь повинна бути зверху замість Паскаля. Цей не працював у всіх випадках.
Jithesh Kt

1
Це відповідь. Затверджений - WRONG. Ну, у гессельбома є також ... Ви також можете використовувати цей еквівалент: preg_split ('/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); заради краси :) Чому це єдина хороша відповідь? Оскільки ви не можете припустити, який тип кінця рядка ви отримаєте: Mac (\ r), Windows (\ r \ n) або Unix (\ n).
Ninj

2
\R матчі \n , \rі\r\n
mpen

1
Або коротше/\r?\n/
Джейсон Шиллінг

Цей приклад правильний, оскільки ви не можете просто виконати будь-яку розділену операцію, що базується лише на одному символі. Якщо ви зробите це, увімкнувши "\ r" або "\ n", ви закінчите зайвий порожній рядок у випадку закінчення "\ r \ n" Windows. І важливо, щоб спочатку було протестовано дво символьний роздільник Windows.
AndresRohrAtlasInformatik

281

Розрив рядка визначається по-різному на різних платформах, \ r \ n, \ r або \ n.

Використовуючи RegExp для розділення рядка, ви можете зрівняти всі три з \ R

Отже, для вашої проблеми:

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

Це відповідало б розривам рядків у Windows, Mac та Linux!


3
Я також використовував це замість прийнятої відповіді та будь-яких інших відповідей на цю тему. Просто залишивши цей коментар як інформативний.
Сет Малакі

3
Насправді це для мене не вийшло. Іноді нові рядки, де ще є клавіші масиву.
Моріс


32
Просто використовуйте$array = preg_split ('/\R/', $string);
Ян Гойвартс

18
Не працює іноді! preg_split("/\r\n|\n|\r/", $string)кращий вибір
Олексій Б.

34

PHP вже знає нові рядки символів поточної системи. Просто використовуйте константу EOL.

explode(PHP_EOL,$string)

18
Так, але ви можете редагувати файл або, наприклад, у цьому прикладі запис db в Windows, а потім використовувати його в системі Linux, наприклад. Я думаю, що загальний підхід підходить краще.
Cranio

Я не впевнений, що це правильно. Якщо текст веб-сторінки надсилається, він може мати різні символи кінця рядка залежно від браузера користувача, а не операційної системи сервера. Тож незалежно від того, яку ОС ви використовуєте, вам потрібно буде мати можливість що-небудь розібрати. Це припускаючи, що ви, звичайно, займаєтеся веб-речами.
Магматичний

Потім, можливо, доведеться використовувати trim()в отриманих рядках для видалення сторонніх пробілів.
Тім

30

Альтернативою відповіді Девідса, яка швидше (набагато швидше) є використання str_replaceта explode.

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

Що відбувається так:
Оскільки розриви рядків можуть набувати різної форми, я str_replace\ r \ n, \ n \ r і \ r замість \ n замість (і початковий \ n зберігається).
Потім вибухніть \nі у вас є всі рядки в масиві.

Я зробив орієнтир на src цієї сторінки і розділив рядки 1000 разів на цикл for: і
preg_replaceвзяв середнє значення 11 секунд,
str_replace & explodeзайняв середню приблизно 1 секунду

Більш детальна інформація та орієнтир на моєму форумі


Ваше посилання на форум (і весь домен), здається, не працює
Нікіта,

19

Девід: Чудовий напрямок, але ви пропустили \ r. це працювало для мене:

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

11

Вам не потрібні функції preg_ *, ні шаблони preg, ні str_replace всередині тощо, щоб успішно розбити рядок на масив новими рядками. У всіх сценаріях, будь то Linux / Mac або m $, це буде зроблено.

<?php 

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

?>

PHP_EOL - це константа, що містить символи переривання рядків, використовувані платформою сервера.


3
файл може надходити з іншої системи з різними новими рядками, зокрема в чистому середовищі, для якого використовується PHP
Лука C.

Саме це є причиною існування цієї константи .. і вирішує цю проблему.
Моторошний

якщо ви берете файл з Windows, він не збігається з файлом з Unix, або Mac, правда?
Лука C.

Якщо ви постійно використовуєте чистий utf-8, скрізь скрізь, включені файли utf8, як правило, і у вас немає нічого іншого, крім вашого PHP_EOL внутрішнього коду для виявлення розривів рядків, він буде збігатися як описано, і ніяка непередбачувана поведінка не відбуватиметься. Майте на увазі, що я не тільки кричу і заявляю про це. Використання PHP_EOL досить підтверджено.
Моторошний

1
У вашому випадку, якщо джерела надходять з іншого місця і не формуються добре, як би там не було, це може бути краще, якщо ви використовуєте str_replace (швидше, ніж regexp). ... загалом, будь то regexp. або str_replace або PHP_EOL, є одне старе хороше речення: "Якщо це працює - не торкайся його!". :)
Spooky

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

"(Замість") є досить важливим, оскільки в іншому випадку розрив рядка не трактується.


9

StackOverflow не дозволить мені коментувати відповідь гессельбом (недостатньо репутації), тому я додаю свою власну ...

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

Це найкраще працювало для мене, оскільки воно також автоматично виключає пробіл (другий \ s *) та трейлінг (перший \ s *), а також пропускає порожні рядки (прапор PREG_SPLIT_NO_EMPTY).

- = ВАРІАНТИ = -

Якщо ви хочете зберегти провідний пробіл, просто позбудьтесь другого \ 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 * там. Але якщо все, що ви хочете, це розділити на новий рядок (як підказує заголовок), це ЦЕ просто (як згадував Ян Гойвартс) ...

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

mМодифікатор дійсно не потрібен він? Це не тільки впливає ^і $?
mpen

@mpen Так, я вважаю, ти прав. Я просто переніс це разом із версією гессельбома. Я відредагую свою публікацію.
Дін Фокс

7
<anti-answer>

Як вказано в інших відповідях, використовуйте, explodeа не splitтому, що з PHP 5.3.0 splitзастаріло. тобто НЕ так, як ви хочете це зробити:

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

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

</anti-answer>

3

Для тих, хто намагається відобразити кронштейни на кротобі та розчаруватись, як розділити кожен рядок, використовуйте explode:

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

використання '\ n', схоже, не працює, але chr (10) працює добре: D

сподіваюся, що це рятує від деяких головні болі.


Привіт Джефф, ласкаво просимо до SO. Ви повинні переписати це як питання та відповідь, а не відповідь на чуже питання. Це веб-сайт із питань питань, а не загальний форум. Подивіться на FAQ - stackoverflow.com/faq
Ребекка Скотт

Використання '\n'не працює, оскільки послідовності втечі не інтерпретуються в одинарних лапках, замість "\n"цього потрібно використовувати подвійні лапки: замість 'n'Read php.net/manual/en/language.types.string.php
Christopher K.


2

Ви можете зробити $ string = nl2br ($ string), щоб змінити ваш розрив рядка на

<br />. 

Таким чином, не має значення, чи система використовує \ r \ n або \ n або \ r

Потім ви можете подати його в масив:

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

Примітка: nl2br не замінює розриви рядків ... він лише вставляє тег розриву перед кожним розривом рядка. Тож усі елементи масиву, окрім першого, розпочнуться з розриву рядка. Якщо це для вас не має значення, то цей метод є найшвидшим. Якщо це має значення, відповідь Джакара найшвидший.
Авст

2

Це мій шлях:

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

Це також пропустить усі порожні рядки.


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

істинний масив:

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


Додайте пояснення з відповіддю, як ця відповідь допоможе ОП у вирішенні поточного питання
ρяσѕρєя K

1

Вибрано це в документах 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);
?>

0

Цей метод завжди працює для мене:

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

1
Любіть лаянку, як частину коду. :) У будь-якому випадку, замінити на \ n простіше та безпечніше (дивіться інші відповіді).
Стефан Рейх

0

Використання лише базового пакету - це також рішення для простих випадків:

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

-6

Використовуючи будь-який спеціальний символ між рядком або розривом рядка \nза допомогою PHP explode, ми можемо досягти цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.