Рекурсивное редактирование многомерного массива

#php #arrays #recursion #multidimensional-array

#php #массивы #рекурсия #многомерный массив

Вопрос:

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

 function mysqlifyArray($array)
  {
      global $connection;
      foreach ($array as amp;$item)
      {
          if (is_string($item))
          {
              echo $item;
              $item = mysqli_real_escape_string($connection, $item);
              echo $item.'<br>';
          }
          elseif (is_array($item))
          {
              $item = mysqlifyArray($item);
          }
      }
      unset($item);
      return $array;
  }
  

Комментарии:

1. почему рекурсивный, а не просто циклический по каждому измерению?

2. @AllanS. Хансен, потому что количество измерений может варьироваться

Ответ №1:

Ответ №2:

В качестве альтернативы, вы могли бы использовать встроенный array_walk_recursive()

 function mysqlify(amp;$value, $index) {
    global $connection;
    return $value = mysqli_real_escape_string($connection, $value);
}

function mysqlify_array(amp;$array) {
    return array_walk_recursive($array, 'mysqlify');
}
  

Ответ №3:

Это может помочь вам:

 function mysqlifyArray($array)
{
    global $connection;
    foreach ($array as $item)
    {
        if (is_string($item)) {
            echo $item;
            $item = mysqli_real_escape_string($connection, $item);
            echo $item.'<br>';
        } else if (is_array($item)) {
            $item = mysqlifyArray($item);
        }

        unset($item);
    }

    return $array;
}
  

Примечание: я не уверен, почему вы использовали ссылку для переменной $item, вместо этого вы можете использовать ссылочную переменную в методе.

Комментарии:

1. Я думаю, что передача ссылок устарела в 5.3.0 и удалена из 5.4.0.

2. @copper.hat У вас есть какая-нибудь ссылка для поддержки этого?

3. @swordofpain: Посмотрите на первую заметку в php.net/manual/en/language.references.pass.php .

4. @copper.hat Это не одно и то же. В нем говорится, что вы получите сообщение об ошибке, если попытаетесь принудительно ввести ссылку во время вызова (т. Е. При вызове функции, например $b = my_func(amp;$a) ). В нем также говорится, что достаточно объявить ссылку во время определения (т. Е. При объявлении функции, например function my_func(amp;$a) { ... } ). Я полагаю, что разработчики PHP немного очищают свою кодовую базу и удалили некоторые крайние случаи, когда для работы механизма требовались ссылки как на время определения, так и на время вызова.

5. @swordofpain: OP отредактировал ответ, ранее там была строка вида «$item = mysqlifyArray (amp;$item);», на которую ссылался мой комментарий. Я должен был быть немного более четким в отношении того, что я имел в виду.