PHP切换,为什么这不起作用?

时间:2012-03-26 19:54:08

标签: php arrays switch-statement

我有一个奇怪的问题,我似乎无法解决。我有相当复杂的代码,但我已经简化了它,问题仍然存在。

请参阅以下内容:

<?php
$meta = array('meta_title' => 'correct');

switch (true) {
    case empty($meta['meta_description']):
        $meta['meta_description'] = 'incorrect';
    case empty($meta['meta_keywords']):
        $meta['meta_keywords'] = 'incorrect';
    case empty($meta['meta_title']):
        $meta['meta_title'] = 'incorrect';
}

print_r($meta);

现在由于某种原因,他将meta_title作为错误的事件返回,尽管它在数组中清楚地设置了。这几乎就像它忽略了这个案子并且只是摔倒了。

我在http://codepad.org/mQH9Kf1L

设置了一个示例

提前致谢!

更新

看看我在哪里使用它可能更有意义。请参阅以下内容: http://codepad.org/WnxBp8Nt(第43行)

出于兴趣,我改变了我添加了一个快速的微量计,并测试了这个版本和一个用单独的ifs编写的版本。 if版本出现的速度有点慢。

6 个答案:

答案 0 :(得分:4)

它没有做你想要的是因为如果情况1是真的,情况2&amp; 3自动触发(如果情况2为真,则情况3始终触发)。这不是switch的用途。你真的只需要3个单独的if条款:

<?php
$meta = array('meta_title' => 'correct');

if (empty($meta['meta_description']))
        $meta['meta_description'] = 'incorrect';
if (empty($meta['meta_keywords']))
        $meta['meta_keywords'] = 'incorrect';
if (empty($meta['meta_title']))
        $meta['meta_title'] = 'incorrect';

print_r($meta);

答案 1 :(得分:2)

引用PHP Documentation for Switch

  

了解如何执行switch语句非常重要   为了避免错误。 switch语句逐行执行   (实际上,声明中的声明)。一开始,没有代码   执行。仅当找到具有值的case语句时   匹配PHP表开始执行的switch表达式的值   声明。 PHP继续执行语句直到结束   切换块,或第一次看到break语句。如果   你不要在案件陈述的末尾写一个破产陈述   列表,PHP将继续执行以下案例的陈述。

您实际上要做的是:

<?php
$meta = array('meta_title' => 'correct');

switch (true) {
    case empty($meta['meta_description']):
        $meta['meta_description'] = 'incorrect';
}
switch (true) {
    case empty($meta['meta_keywords']):
        $meta['meta_keywords'] = 'incorrect';
}
switch (true) {
    case empty($meta['meta_title']):
        $meta['meta_title'] = 'incorrect';
}

print_r($meta);

答案 2 :(得分:1)

请记住break

$meta = array('meta_title' => 'correct');

switch (true) {
    case empty($meta['meta_description']):
        $meta['meta_description'] = 'incorrect';
        break;
    case empty($meta['meta_keywords']):
        $meta['meta_keywords'] = 'incorrect';
        break;
    case empty($meta['meta_title']):
        $meta['meta_title'] = 'incorrect';
        break;
}

print_r($meta);

此外, 无意义

不应该使用上面的switch语句。

尝试使用if...elseif...

if(empty($meta['meta_description']))
    $meta['meta_description'] = 'incorrect';
elseif(empty($meta['meta_keywords']))
    $meta['meta_keywords'] = 'incorrect';
elseif(empty($meta['meta_title']))
    $meta['meta_title'] = 'incorrect';

答案 3 :(得分:1)

休息不会解决问题。如果/其他因为很多需要就行不通。你的代码也毫无意义。你听说过foreach吗?

<?php
$MetaDefault = array('meta_description', 'meta_title', 'meta_keywords');

$Meta = array('meta_title' => 'correct');

foreach($MetaDefault as $Row){
    if(!isset($Meta[$Row])){
        $Meta[$Row] = 'incorrect';
    }
}

print_r($Meta);
?>

如果你休息,它将退出开关。 你的其他变量不会被测试。 如果/ else也会这样做。

答案 4 :(得分:1)

单个case为真后,除了其他case语句外,其他所有代码都将在中执行。请参阅php documentation for the switch statement

  

switch语句逐行执行(实际上是逐个语句)。一开始,没有代码被执行。只有当找到的case语句的值与switch表达式的值匹配时,PHP才会开始执行语句。 PHP继续执行语句,直到switch块结束,或者第一次看到break语句。如果你不在case语句列表的末尾写一个break语句,PHP将继续执行以下情况的语句。

所以这里发生的是以下内容:

switch (true) {
    case empty($meta['meta_description']): // MATCH
        $meta['meta_description'] = 'incorrect';  // EXECUTE
    case empty($meta['meta_keywords']): // SKIP
        $meta['meta_keywords'] = 'incorrect'; // EXECUTE
    case empty($meta['meta_title']): // SKIP
        $meta['meta_title'] = 'incorrect'; // EXECUTE
}

请注意,以下case语句正文执行:

switch(true) {
    case false:
        echo "Not Executed\n";
    case true:
        echo "Executed\n";
    case print("Condition Not Executed\n"):
        echo "Also Executed\n";
}

这将打印:

Executed
Also Executed

答案 5 :(得分:-1)

您没有任何break语句。为每个案例添加一个,它将起作用。

正在发生的事情是,第一种情况(empty($meta['meta_description']))正在评估true而没有任何break语句,其余案例的代码也会执行,因此{ {1}}设置为不正确,因此meta_keywords

鉴于这是meta_title语句的工作原理,您可能不希望使用switch语句。你可能正在寻找更像这样的东西:

switch

或者您可以使用循环:

$meta = array('meta_title' => 'correct');

if (empty($meta['meta_description']))
    $meta['meta_description'] = 'incorrect';
if (empty($meta['meta_keywords']))
    $meta['meta_keywords'] = 'incorrect';
if (empty($meta['meta_title']))
    $meta['meta_title'] = 'incorrect';

print_r($meta);

这两个都应该产生相同的结果,但如果你有更多的属性,循环会更容易和更短。