Explode () дает мне пустые значения, которые я не ожидаю - PullRequest
2 голосов
/ 30 января 2020

То, что я пытаюсь сделать, это отделить строку, основываясь на том, как manys \ n она имеет ... например, если я использую это:

$string = "Hello\n stackoverflow";
$explode_insert = explode("\n", $string);

мой ожидаемый результат будет

  1. Привет
  2. ""
  3. stackoverflow

, если $string:

$string = "Hello \nstackoverflow\n\n how are you!"

мой ожидаемый результат будет:

  1. Hello
  2. ""
  3. stackoverflow
  4. ""
  5. ""
  6. как дела!

но вместо этого, если разнесение получает "\ n \ n", оно выдает следующее:

  1. ""
  2. ""
  3. ""

есть дополнительные "", которые мне не нужны, какие-либо идеи, почему это происходит?

Ответы [ 4 ]

3 голосов
/ 30 января 2020

PHP s explode работает на границах предоставленного разделителя, и, таким образом, это ожидаемые результаты.

Вот пример:

\n\n

Это дает 3 пустых строки, поскольку есть 3 области, которые не являются "\ n", до, между и после; смотрите здесь:

\n\n
^ ^ ^
0 голосов
/ 30 января 2020

Это даст вам celar результат Hello stackoverflow с str_replace

$string = "Hello\n stackoverflow";
$explode_insert = str_replace('\n', '', $string);
echo $explode_insert;

Вот еще несколько примеров:

$string  = "piece1\n piece2\n piece3\n piece4\n piece5\n piece6\n";
$pieces = explode(" ", $string);
//Simple example
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

echo "<br>-----<br>";

var_dump($pieces);

echo "<br>-----<br>";
print_r($pieces);

Выходы:

piece1 piece2
-----
C:\wamp\www\a\test2.php:24:
array (size=6)
  0 => string 'piece1
' (length=7)
  1 => string 'piece2
' (length=7)
  2 => string 'piece3
' (length=7)
  3 => string 'piece4
' (length=7)
  4 => string 'piece5
' (length=7)
  5 => string 'piece6
' (length=7)

-----
Array ( [0] => piece1 [1] => piece2 [2] => piece3 [3] => piece4 [4] => piece5 [5] => piece6 )

Подробнее о php. net: https://www.php.net/manual/en/function.explode.php

0 голосов
/ 30 января 2020

Я запустил следующий код:

<?php
$string = "Hello\n stackoverflow";
$explode_insert = explode("\n", $string);
var_dump($explode_insert);

Я получил следующие результаты:

array(2) {
  [0]=>
  string(5) "Hello"
  [1]=>
  string(14) " stackoverflow"
}

Причина в том, что при разрыве строки строка разделяется в разделителе в массив, удаляя разделитель. Это означает, что он удаляет «\ n» и разбивает строку на две части: «Hello» и «stackoverflow».

Вторая строка приводит к:

array(4) {
  [0]=>
  string(6) "Hello "
  [1]=>
  string(13) "stackoverflow"
  [2]=>
  string(0) ""
  [3]=>
  string(13) " how are you!"
}

Это потому что удаление двух "\ n \ n" приводит к пустой строке. Отсюда и второй индекс в массиве.

0 голосов
/ 30 января 2020

Если взрываемая строка заканчивается разделителем, в конце массива результата всегда будет пустая строка. Если вы хотите избежать этого, вы можете обрезать разделитель на конце строки, прежде чем взорвать ее.

$result = explode("\n", rtrim($string, "\n"));

Однако rtrim удалит все новые строки с конца строка, так что если вы используете ее в своем примере "\n\n", результирующий массив будет иметь только одну пустую строку, а не две, которые вы хотите. Если вы хотите удалить только последний символ новой строки, вместо него можно использовать preg_replace.

$result = explode("\n", preg_replace('/(.+)\n$/s', '$1', $string));
...