Как я могу удалить слова из массива, которые находятся после новой строки?

Я хочу получить строки после каждого : и перед каждым \n из следующего:

När:Sent lördag kväll och natt till söndag\nVar:Främst norra Jämtland\nIntensitet:Väst ca 21 m/s\nKommentar:-

Источник (alert[4]->info->description когда был задан этот вопрос): https://opendata-download-warnings.smhi.se/api/version/2/alerts.json

Я пробовал с explode(), но после этого я понятия не имею, как я могу удалить \nVar и другие из массивов.

array(5) {
  [0]=>
  string(4) "När"
  [1]=>
  string(45) "Sent lördag kväll och natt till söndag
Var"
  [2]=>
  string(34) "Främst norra Jämtland
Intensitet"
  [3]=>
  string(25) "Väst ca 21 m/s
Kommentar"
  [4]=>
  string(1) "-"
}

Вот как я хочу, чтобы это выглядело:

array(5) {
  [0]=>
  string(45) "Sent lördag kväll och natt till söndag"
  [1]=>
  string(34) "Främst norra Jämtland"
  [2]=>
  string(25) "Väst ca 21 m/s"
  [3]=>
  string(1) "-"
}

Вот как я пытался до сих пор:

$content = file_get_contents('https://opendata-download-warnings.smhi.se/api/version/2/alerts.json');
$content = json_decode($content);

foreach($content->alert AS $alert) {
    if ($alert->info->area->areaDesc == '013') {
        $desc = explode(':', $alert->info->description);
        $descc = explode("\n", $desc);    # Don't know how to explode by \n since it returns an error; explode() expects parameter 2 to be string
        echo '<pre>'; var_dump($desc); echo '</pre>';
    }
}
Don't know how to explode by \n since it returns an error; explode() expects parameter 2 to be string хм... вы пытаетесь взорвать массив, поскольку $desc — это массив.
kuh-chan 23.03.2019 19:44

Ok. Не думал об этом в таком ключе :) Спасибо, но проблема остается проблемой, так как я не знаю, что делать дальше.

Airikr 23.03.2019 19:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать регулярное выражение для захвата того, что находится между : и \n.

$text = "När:Sent lördag kväll och natt till söndag\nVar:Främst norra Jämtland\nIntensitet:Väst ca 21 m/s\nKommentar:-";
preg_match_all("/\w+:(.*?)\\n/", $text, $match);
print_r($match);

Выход:

Array
(
    [0] => Array
        (
            [0] => r:Sent lördag kväll och natt till söndag

            [1] => Var:Främst norra Jämtland

            [2] => Intensitet:Väst ca 21 m/s

        )

    [1] => Array
        (
            [0] => Sent lördag kväll och natt till söndag
            [1] => Främst norra Jämtland
            [2] => Väst ca 21 m/s
        )

)

https://3v4l.org/rpu5E


Sadly my regex mojo is not with me today...
So I had to switch to good old explode and array_functions.
I multiexplode the array on : and \n then I intersect the array on the uneven keys using range() to get the keys needed.
$text = "När:Sent lördag kväll och natt till söndag\nVar:Främst norra Jämtland\nIntensitet:Väst ca 21 m/s\nKommentar:Sydväst 14-17 m/s. Avtagande söndag morgon.";

$exploded = multiexplode(array("\n",":"), $text);
if (count($exploded) > 2){
    $range = array_flip(range(1,count($exploded),2));
}else{
    $range = ["1" => 1];
}

$result = array_intersect_key($exploded, $range);
print_r($result);

Выход:

Array
(
    [1] => Sent lördag kväll och natt till söndag
    [3] => Främst norra Jämtland
    [5] => Väst ca 21 m/s
    [7] => -
)

Если вам нужен индексированный массив 0, используйте array_values ​​для сброса ключей.
https://3v4l.org/tbgLM

Спасибо за ваш ответ. Это сработало замечательно, несмотря на то, что когда дело доходит до того, когда Kommentar: пуста или является единственной строкой в ​​$alert[int]->info->description. Этот контент возвращается пустым, даже если в нем есть контент, например: Kommentar:Natt till söndag och söndag morgon väst eller sydväst ca 15 m/s. (тот же источник, но для $alert[0]->info->description на момент написания этого комментария).

Airikr 23.03.2019 19:59

Я только что заметил. Работа над исправлением.

Andreas 23.03.2019 20:00

Хотя я заметил баг. Если я изменю строку в $text на Kommentar:Sydväst 14-17 m/s. Avtagande söndag morgon., я получу следующие ошибки: Warning: range(): step exceeds the specified range in F:\Websites\www\vadret-justnu\index.php on line 18. Warning: array_flip() expects parameter 1 to be array, bool given in F:\Websites\www\vadret-justnu\index.php on line 18. Warning: array_intersect_key(): Expected parameter 2 to be an array, null given in F:\Websites\www\vadret-justnu\index.php on line 18

Airikr 23.03.2019 20:47

@Эрик исправил это. Другой вариант — ассоциативный массив вроде этого: 3v4l.org/ptE29

Andreas 23.03.2019 22:33

Вы можете использовать эту функцию

    <?php
function getContents($str, $startDelimiter, $endDelimiter) {
  $contents = array();
  $startDelimiterLength = strlen($startDelimiter);
  $endDelimiterLength = strlen($endDelimiter);
  $startFrom = $contentStart = $contentEnd = 0;
  while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
    $contentStart += $startDelimiterLength;
    $contentEnd = strpos($str, $endDelimiter, $contentStart);
    if (false === $contentEnd) {
      break;
    }
    $contents[] = substr($str, $contentStart, $contentEnd - $contentStart);
    $startFrom = $contentEnd + $endDelimiterLength;
  }

  return $contents;
}

$sample = 'När:Sent lördag kväll och natt till söndag\nVar:Främst norra Jämtland\nIntensitet:Väst ca 21 m/s\nKommentar:-';
print_r( getContents($sample, ':', '\n') );
 ?>

РЕЗУЛЬТАТ

Array
 (
   [0] => Sent lördag kväll och natt till söndag
   [1] => Främst norra Jämtland
   [2] => Väst ca 21 m/s
 )

Он возвращает пустой массив только тогда, когда я пробую его в цикле foreach с $alert->info->description вместо $sample. Но он отлично работает, если я использую чистый текст (как в вашем ответе).

Airikr 23.03.2019 20:10

Как это возможно? Вы используете class или что-то не так в $alert->info->description

Zain Farooq 23.03.2019 20:13

Другие вопросы по теме