Как переместить все элементы массива в глобальную область видимости в PHP? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть функция в PHP, которая возвращает массив:

$Function_Returned_Array = array(

  ['Array_1'] => array('Element1', 'Element2', 'Element3'),
  ['Array_2'] => array('Element4', 'Element5', 'Element6'),
  ['Array_3'] => array('Element7', 'Element8', 'Element9')
);

Но что мне действительно нужно в глобальной области видимости, так это три отдельных массива:

  $Array_1 = array('Element1', 'Element2', 'Element3');
  $Array_2 = array('Element4', 'Element5', 'Element6');
  $Array_3 = array('Element7', 'Element8', 'Element9');

Это так, чтов глобальной области мне не нужно звонить:

$Function_Returned_Array['Array_1']

Но вместо этого я могу позвонить:

$Array_1

Как я могу переместить все элементы массива в глобальную область?

Ответы [ 3 ]

4 голосов
/ 05 июня 2019

Вы можете сделать:

<code>foreach ($fnc_returned_arr as $key => $arr)
{
    ${$key} = $arr;
}

echo '<pre>'. print_r($Array_1, 1) .'
';

Таким образом, мы просто зациклимся и используем ключ массива в качестве имени переменной для использования в другом месте:)

3 голосов
/ 05 июня 2019

Как я отметил в комментарии, в PHP есть функция, которая будет делать именно это:

$Function_Returned_Array = array(
  'Array_1' => array('Element1', 'Element2', 'Element3'),
  'Array_2' => array('Element4', 'Element5', 'Element6'),
  'Array_3' => array('Element7', 'Element8', 'Element9')
);

extract($Function_Returned_Array);
print_r($Array_1); //Works

Однако из-за отсутствия контекста я должен отметить, что с этим решением есть несколько заметных предостережений:

  1. Вы рискуете перезаписать другие переменные с тем же именем. PHP не будет предупреждать или иным образом уведомлять вас, что это происходит. Например, рассмотрим следующий код:
function saveData() {
     $isAuthenticated = $_SESSION['user'];
     extract($_POST);
     if (!$isAuthenticated) {
        return false;
     }
     // Save data
}

Проблема здесь в том, что кто-то отправляет isAuthenticated как часть полезной нагрузки запроса, которая перезапишет вашу собственную переменную.

  1. Большинство IDE не будут знать о существовании этих переменных, что приведет к потере любой помощи по завершению и получению предупреждений о неопределенных переменных.
2 голосов
/ 05 июня 2019

После работы над этим в течение некоторого времени это мое собственное решение, использующее:

  • array_keys()
  • динамические переменные

Есть лилучшее решение, чем это?

for ($i = 0; $i < count(array_keys($My_Array)); $i++) {

  ${array_keys($My_Array)[$i]} = $My_Array[array_keys($My_Array)[$i]];
}
...