有人可以解释为什么在调用标题($ URL)时,此代码中的$ URL变量始终设置为“Location:unknown.php”?如果我在第一行注释掉声明/初始化代码工作,但我得到一个变量未声明的警告(如果我在if块之前声明$ URL而没有初始化它,我也会收到这些警告)。
$URL = 'Location: unknown.php';
if ($spring){
if (($leaves)&&(!$stem)&&(!$root)&&(!$head)&&(!$whole)){$URL = 'Location: snow-mold.php';}
} else if ($other) {
if ((!$leaves)&&(!$stem)&&(!$root)&&($head)&&(!$whole)){$URL = 'Location: o01.php';}
if (($whole) || ($root) ){$URL = 'Location: o02.php';}
if (($leaves)&&($stem)&&(!$root)&&($head)&&(!$whole)){$URL = 'Location: o03.php';}
if (($leaves)&&($stem)&&(!$root)&&(!$head)&&(!$whole)){$URL = 'Location: o04.php';}
if ((!$leaves)&&($stem)&&(!$root)&&($head)&&(!$whole)){$URL = 'Location: o03.php';}
if (($leaves)&&(!$stem)&&(!$root)&&($head)&&(!$whole)){$URL = 'Location: o05.php';}
if ((!$leaves)&&($stem)&&(!$root)&&(!$head)&&(!$whole)){$URL = 'Location: o06.php';}
if (($leaves)&&(!$stem)&&(!$root)&&(!$head)&&(!$whole)){$URL = 'Location: o07.php';}
}
header($URL);
好的,我已经简化了代码以突出问题......
$spring = (isset($_POST['season']) && strcmp($_POST['season'],'spring') == 0);
$URL = 'Location: unknown.php';
if ($spring){
$URL = 'Location: snow-mold.php';
}
header($URL);
始终重定向到unknown.php。如果我将$URL = 'Location: unknown.php'
更改为$URL;
,当且仅当选择了spring时,代码会重定向到snow-mold.php,但我收到$ URL未定义的警告。
答案 0 :(得分:2)
好吧,您可以使用一系列if-elsif
构造重写代码 - 例如,在leaves
分支中,您的穷人$other
将不会被检查7次。
但我建议采用另一种方法:实现一种(某种)散列函数,它将所有这些树部分作为参数(或者更好的是,将这些值作为键的单个关联数组):
function happy_tree_hash($leaves, $stem, $root, $head, $whole) {
// assuming each of this can be only TRUE or FALSE,
// a bit mask should suffice:
return (bool)$leaves << 4
| (bool)$stem << 3
| (bool)$root << 2
| (bool)$head << 1
| (bool)$whole;
}
...然后从简单的关联数组中为$url
变量赋值:
$locations = array(
5 => 'o02.php', // whole and root
16 => 'o07.php', // leaves only
...
);
...
$key = happy_tree_hash($leaves, $stem, $root, $head, $whole);
if (isset($locations[$key])) {
$url = $locations[$key];
} else {
$url = 'unknown.php';
}
header("Location: $url");