PHP — Переменные Переменные и array_merge() — не работает

#php #arrays #variables #variable-variables #array-merge

#php #массивы #переменные #переменная-переменные #массив-слияние

Вопрос:

У меня есть куча массивов, которые хранятся в разных переменных, таких как $ required, $ reserved и т.д…

Я хотел бы разрешить (внутри функции) передавать массив параметров (например $options = array('required', 'reserved') ), и этот массив затем использовался бы для определения, какие массивы объединять вместе и возвращать в конце функции.

Итак, у меня есть этот код в части функции, которая должна захватить все параметры и объединить массивы, используя переменные переменные для получения массивов из строк, переданных в массиве опций):

 $array = array();

foreach ($options as $key) {
  $array_to_merge = ${$key};
  array_merge($array, $array_to_merge);
}

return $array;
  

Однако, когда я возвращаю $array, он показывает 0 элементов. Если я print_r($array_to_merge); , я действительно получу весь массив, как и должен.

Array_merge () просто не работает с переменными переменными, или я что-то здесь упускаю …?

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

1. Вы пробовали array_push() вместо этого? Я использовал это и добился большого успеха с этим.

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

Ответ №1:

array_merge возвращает объединенный массив, вы ничему не присваиваете это возвращаемое значение и, следовательно, оно теряется.

 $array = array_merge($array, $array_to_merge);
  

должно решить вашу проблему.

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

1. Это отвечает на вопрос, который у меня был, хотя мне также очень нравится ответ Марио ниже … спасибо за помощь от вас обоих!

Ответ №2:

Если я правильно прочитал, вы также можете упростить свой код (заменить цикл), просто:

  $array = call_user_func_array("array_merge", compact($options));
  

compact заменяет переменную variable lookup и получает список массивов. И, по сути, требуется только один array_merge вызов.

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

1. Вау, это потрясающе! Никогда раньше не использовал / не видел compact (), и он делает почти именно то, что мне нужно … к сожалению, у меня здесь многомерный массив, поэтому я не знаю, подходит ли compact в данном случае.