在使用PHP时,我经常写像这样的代码:
$target = $_SESSION[AFTER_LOGIN_TARGET];
unset($_SESSION[AFTER_LOGIN_TARGET]);
return $target;
在Python中,有一个dict.pop
方法可以让我在一条语句中完成类似的操作,而不需要使用临时变量:return session.pop(AFTER_LOGIN_TARGET)
PHP中是否有类似的函数或技巧?
我没有看到内置的函数可以做到这一点,但你可以轻松地创建自己的函数。
/**
* Removes an item from the array and returns its value.
*
* @param array $arr The input array
* @param $key The key pointing to the desired value
* @return The value mapped to $key or null if none
*/
function array_remove(array &$arr, $key) {
if (array_key_exists($key, $arr)) {
$val = $arr[$key];
unset($arr[$key]);
return $val;
}
return null;
}
您可以将它用于任何数组,例如$_SESSION
:
return array_remove($_SESSION, 'AFTER_LOGIN_TARGET');
简明扼要
在 PHP 7+ 中,你可以使用null合并运算符大大缩短这个函数。你甚至不需要使用isset()
!
function array_remove(array &$arr, $key) {
$val = $arr[$key] ?? null;
unset($arr[$key]);
return $val;
}
null
,isset
将返回false
,导致函数保留数组中的条目。 - David Harknessarray_key_exists
。使用 isset
就足够了。 - Eugenephp -r '$x["foo"] = null; var_dump(isset($x["foo"]));'
输出 bool(false)
。虽然 array_key_exists
稍微慢一些,但它会返回 true
,即使键映射到 null
。 - David Harkness$target = array_slice(
$_SESSION,
array_search('AFTER_LOGIN_TARGET', $_SESSION),
1
);
这是使用null coalesce的此答案的变体。
function array_remove(array &$arr, $key) {
$value = $arr[$key] ?? null;
unset($arr[$key]);
return $value;
}
为什么不考虑使用一个辅助函数?就像这样:
function getAndRemoveFromSession ($varName) {
$var = $_SESSION[$varName];
unset($_SESSION[$varName]);
return $var;
}
所以如果你调用
$myVar = getAndRemoveFromSession ("AFTER_LOGIN_TARGET");
你得到了你所要求的(试着用一下,我很久没有使用 PHP 了 :-])
dict.pop()
函数所做的事情,在所描述的情况下是无用的。 - lanzz