如果你对 isset() 关于 null 值的行为感到厌烦,这里有一个方便的函数供你使用。它类似于 array_key_exists,但更灵活,可以检查多个数组中的多个数组键。
非递归!
在 php 8.1.6,linux 上测试
<?php
function is_set(string $var_name, array|null|string ... $args): bool {
$vars[$var_name] = null;
if (array_key_exists(0, $args)) {
if (is_array($args[0])) {
$vars[$var_name] = $args[0];
} elseif (is_string($args[0])) {
goto main;
}
unset($args[0]);
}
main:
if ($args) {
$args = array_reverse($args);
$cur_array = null;
array_walk($args, function ($value) use (&$cur_array, &$vars): void {
if (!is_string($value)) {
$cur_array = $value;
} else {
$vars[$value] = $cur_array;
}
});
}
foreach ($vars as $name => $array) {
if (!array_key_exists($name, $array??$GLOBALS)) return false;
}
return true;
}
$arr1 = range(0, 5);
$arr2 = [
'a' => 1,
'b' => 2,
'c' => 'hELLO wORLD!'
];
$gender = 'male';
$age = 12;
var_dump(is_set('age')); var_dump(is_set('age', null)); var_dump(is_set('age', $arr1)); var_dump(is_set('age', array())); var_dump(is_set('age', array('age' => 48))); var_dump(is_set('age', 'arr1', null, 'b', $arr2, 0, 3, 4, $arr1, 'gender')); var_dump(is_set('age', 'arr1', null, 'b', $arr2, 0, 3, 4, $arr1, 'gender', null)); $c=$d=$e=$a=2;
$arr = [1,4];
var_dump(is_set('a', 'c', null, 0, 1, $arr)); var_dump(is_set('a', 'c', null, 0, 4, $arr)); ?>
注意
它不适用于在函数内本地声明的变量;
但是你可以在函数中使用它来检查数组键是否存在