2016-06-27 4 views
1

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

['key1']['key2']['key3'] 

, а не как интерполированное значение сеанса.

Код:

// Sample $_SESSION superglobal 
Array 
(
    [key1] => Array 
    (
     [key2] => Array 
     (
      [key3] => 'data to return' 
     ) 
    ) 
) 

// Function 
public function session_data($variables = array()) 
{ 
    // Set variables 
    $_dataArray = null; 
    $_dataArray = "['" . implode("']['", $variables) . "']"; 

    // Return 
    return $_SESSION{$_dataArray}; 
} 

// Call function 
var str = session_data(array('key1', 'key2', 'key3')); 
echo str; // Echoes ['key1']['key2']['key3'] instead of 'data to return' 

Что я неправильно делаю? Я думал, что фигурные скобки вокруг $ _dataArray будут генерировать следующее: $ _SESSION ['key1'] ['key2'] ['key3'], интерполировать и возвращать значение (например, «данные для возврата»).

+0

'session_data (массив ('key1', key2' , 'key3')); '' '' пропущено? это опечатка? –

+0

Да, пропустил '. Исправлено. – JsusSalv

ответ

0

Ваше поколение $_dataArray не имеет никакого смысла. То, что вы пытаетесь сделать ($_SESSION['key1']['key2']['key3']) является простой массив:

$array = [ 
    'key1' => [ 
     'key2' => [ 
      'key3' => 'Your data' 
     ] 
    ] 
]; 

$_SESSION = $array; 

echo $_SESSION['key1']['key2']['key3'] . PHP_EOL; // Echoes 'Your data' 
+0

Да, но массив, переданный в функцию, может быть любым количеством значений. Я не могу просто перекодировать $ _SESSION ['key1'] ['key2'] ['key3'], потому что переданные данные могут быть чем-то вроде session_data (array ('key1', 'key2', 'key3', 'key4 ',' key5 ',' key6 ',' key7 ',' key8 ',' key9 ',' key10 'и т. д.)); Это означает, что я должен учитывать все, что передается в функцию динамически. – JsusSalv

+1

Вы можете написать функцию, которая принимает любое количество аргументов с помощью [variadics] (http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list) (в PHP5.6 +) или [func_get_arg()] (http://php.net/manual/en/function.func-get-arg.php). Я не совсем понимаю, чего вы хотите достичь. –

+0

Это идея, как с вариантами, но я хочу получить значения в суперзвезде $ _SESSION. Добавив «$ _SESSION» в {$ _dataArray}, я думал, что он выполнит и вернет связанное значение. Вместо этого я получаю взорванную строку ключей, которые я передал изначально. – JsusSalv

0

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

function loop_through($array){ 
    foreach ($array as $key=> $val){ 
     if (!is_array($val)) { 
      return $val; 
     } else { 
      return (loop_through($val)); 
     } 
    } 
} 

echo loop_through($array); // echoes 'Your data' 
Смежные вопросы