【问题标题】:PHP session variable name as stringPHP会话变量名称为字符串
【发布时间】:2021-01-23 18:01:45
【问题描述】:

我有一个来自数据库的字符串,例如session_user_id,表示我应该从 PHP 中的会话变量中获取 user_id。理想情况下,这应该转换为存在值的$_SESSION['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;
};

我尝试了$sessVal = $_SESSION.$j$sessVal = ${$_SESSION.$j}$sessVal = $_SESSION[$j] 等变体,但似乎都没有。

【问题讨论】:

  • 您的代码正在寻找不存在的$_SESSION['[user][id]']
  • $sessVal = $_SESSION 开始,然后$sessVal = $sessVal[$expval[$i]]; 并重复。
  • $_SESSION['user']['id'] 做的事情,不要尝试生成PHP代码。阅读有关使用 square bracket syntax 访问数组项的信息。
  • @axiac 我的问题是当我不知道数字级别时如何构建它?

标签: php


【解决方案1】:

此问题类似于使用点或斜线表示法(x.y.zx/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_”前缀在这里是噪音,因为它不构成数组结构的一部分(并且因为我们将 $_SESSION 作为数组传入),并且应该简单地预先修剪;例如作为$path = substr($path, strlen('session_')

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

请注意,所有分隔符都将作为路径级别展开,因此建议使用不属于 PHP“单词”的分隔符。由于单个_ 下划线通常用于表示空格,因此将其用作分隔符时可能会出错。想想user/user_details/first_nameuser_user_details_first_name:第一个是明确的,第二个是模棱两可的。

【讨论】:

  • 谢谢。我会试试这个。我的参考模式是一致的,只是我不知道级别数或数组名称(在 session_ 之后)。
  • 使用此解决方案,您可以根据字符串中给出的“数组路径”遍历任意数量的级别/深度。如果你的字符串是users_ravi_details_birthday_year,它将产生$arr['users']['ravi']['details']['birthday']['year']的值。
猜你喜欢
  • 2017-07-19
  • 2012-12-29
  • 1970-01-01
  • 2013-12-03
  • 2014-05-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多