簡體   English   中英

PHP session 變量名作為字符串

[英]PHP session variable name as string

我有一個來自數據庫的字符串,如session_user_id ,表示我應該從 PHP 中的 session 變量中獲取 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]之類的變體,但似乎都沒有。

這種擔憂類似於使用點或斜線表示法( xyzx/y/z )訪問更深層次的數組。 實現它的一種方法是遍歷路徑並在達到時返回請求的級別。 這是一個簡單的非遞歸 function 可以完成這項工作:

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;
}

我們上面所做的就是為數組的每個漸進深度分配一個引用,然后訪問下一級的值,直到路徑結束。 如果給定的密鑰不存在,則 function 返回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 :第一個是明確的,第二個是模棱兩可的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM