PHP会话变量名为字符串

PHP会话变量名为字符串,php,Php,我有一个来自db的字符串,比如session\u user\u id,表示我应该从PHP中的session变量中获取用户id。理想情况下,这应该转换为值存在的$\u会话['user']['id']。下面的方法似乎不起作用 echo fillDefaultValues("session_user_id"); function fillDefaultValues($val) { $expval = explode("_", $val); $j

我有一个来自db的字符串,比如
session\u user\u id
,表示我应该从PHP中的session变量中获取用户id。理想情况下,这应该转换为值存在的
$\u会话['user']['id']
。下面的方法似乎不起作用

echo fillDefaultValues("session_user_id");

function fillDefaultValues($val)
{
    $expval = explode("_", $val);
    $j = "";
    if ($expval[0] == 'session') {
        for ($i=1; $i < count($expval); $i++) {
            $j .= "[".$expval[$i]."]";
        }
        $sessVal = $_SESSION[$j];
    }
    return $sessVal;
};
echo filldefaultvalue(“会话用户id”);
函数fillDefaultValues($val)
{
$expval=explode(“quo,$val”);
$j=”“;
如果($expval[0]=='session'){
对于($i=1;$i

我尝试过像
$sessVal=$\u SESSION.$j
$sessVal=${$\u SESSION.$j}
$sessVal=$\u SESSION[$j]
这样的变体,但似乎都不起作用。

这个问题类似于使用点或斜线符号(
x.y.z
x/y/z
)访问数组的更深层次。实现它的一种方法是迭代路径,并在到达时返回请求的级别。下面是一个简单的非递归函数:

function array_deep(array $array, string $key_path, string $separator = '/')
{
    $path = explode($separator, $key_path);
    $ref =& $array;

    foreach($path as $node) {
        if (isset($ref[$node])) {
            $ref =& $ref[$node];
        }
        else {
            // die('Undefined Index:' . $key_path); // or use your error-handling routine
            return null;
        }
    }
    return $ref;
}
我们在上面所做的是为数组的每个渐进深度指定一个引用,然后访问下一个级别的值,直到路径结束。如果给定的键不存在,函数将返回
null
。您可能希望在此处实现错误/异常处理程序,以区分“索引不存在”与实际的
null
值。用法如下:

// sample array:
$array['x']['y']['z'] = 'yay';

// accessing the value:
$value = array_deep($array, 'x/y/z', '/');

echo $value; // yay
您可以使用您选择的任何分隔符。对于您的情况,您可以拨打:

$value = array_deep($_SESSION, 'user_id', '_');
请注意,来自数据库的变量名中的“session_uu”前缀在这里是noise,因为它不构成数组结构的一部分(并且因为我们将
$\u session
作为数组传递),所以应该在前面进行修剪;e、 g.as
$path=substr($path,strlen('session')

如果在多种情况下应用此方法,请确保来自数据库的任何变量名都与本地变量中的数据模式相匹配,每个分隔符表示更深的数组级别。只有在引用模式一致的情况下,才能自动执行此操作


请注意,所有分隔符都将分解为路径级别,因此使用的分隔符不属于PHP“word”的一部分建议使用。由于通常使用一个
下划线来表示空格,因此将其用作分隔符时可能会出错。请考虑
用户/用户详细信息/第一个\u名称
用户详细信息\u第一个\u名称
:第一个是清晰的,第二个是不明确的。

您的代码正在查找
$\u会话['[user][id]]
不存在。从
$sessVal=$\u会话开始,然后
$sessVal=$sessVal[$expval[$i]];
并重复。执行
$\u会话['user']['id']
是的,不要尝试生成PHP代码。请阅读有关使用@axiac访问数组项的内容。我的问题是,当我不知道级别数时,如何构建它?谢谢。我将尝试此方法。我的引用模式是一致的,只是我不知道级别数或数组名称(在会话之后)。使用此解决方案,您可以根据字符串中给定的“数组路径”遍历任意级别/深度。如果您的字符串是
users\u ravi\u details\u birth\u year
,它将生成
$arr['users']['ravi']['details']['birth']['year']