无法在PHP中的if块中设置变量的值

时间:2012-09-17 15:39:07

标签: php if-statement

有人可以解释为什么在调用标题($ 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未定义的警告。

1 个答案:

答案 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");