Как использовать preg_replace в цикле foreach в многомерном массиве? - PullRequest
0 голосов
/ 01 февраля 2019

Я новичок в PHP.

Моя цель - напечатать три предложения с многомерным массивом:

  1. кошки вонючие

  2. прекрасные птицы

  3. липкие улитки

Но единственное предложение, которое я могу напечатать, это "кошки вонючие ".Я перепробовал много вещей.Итак, вот код:

<?php
$sentence = 'dogs are sweet';

$animals = array('@dogs@' => array('cats', 'birds', 'snails'),
                 '@sweet@' => array('smelly', 'beautiful', 'sticky'));

    foreach ($animals as $key => $value)
    {
        foreach ($value as $subkey => $subvalue)
        {
            $sentence = preg_replace($key, $subvalue, $sentence);
        }
    }
    echo $sentence . '</br>';

?>

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 01 февраля 2019

Существует несколько уровней того, почему ваше решение не работает.

  • Предложение повторяется только один раз
  • Предложение заменяется, поэтому после замены "собаки", он больше ничего не заменит, потому что собак больше нет в предложении.
  • Скрипт перебирает массив животных только один раз.
  • Любой предмет заменяется любым предметом (Вы указалиВы хотите, чтобы кошки были вонючими, птицы были красивыми, а улитки липкими, это значит сравнивать индекс 0 первого массива с индексом 0 второго массива, индекс 1 с индексом 1 и т. д.).

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

$animals = array('@dogs@' => array('cats', 'birds', 'snails'),
                 '@sweet@' => array('smelly', 'beautiful', 'sticky'));

for ($i = 0; $i < count(reset($animals)); $i++) {
  $sentence = 'dogs are sweet';
  foreach ($animals as $key => $value)
  {
      foreach ($value as $subkey => $subvalue)
      {
        if ($subkey === $i) {
          $sentence = preg_replace($key, $subvalue, $sentence);
        }
      }
  }

  echo $sentence . "<br />";
}

Часть count(reset($animals)) считает значение первого элемента массива $animals.Так что в этом случае array('cats', 'birds', 'snails').В сценарии предполагается, что первый и второй массивы всегда равны по размеру.

Оператор if во вторичном цикле foreach предназначен для проверки соответствия правого элемента из одного массива правому элементу из другого.

Надеюсь, это поможет

...