我有一个奇怪的问题,我似乎无法解决。我有相当复杂的代码,但我已经简化了它,问题仍然存在。
请参阅以下内容:
<?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/WnxBp8Nt(第43行)
出于兴趣,我改变了我添加了一个快速的微量计,并测试了这个版本和一个用单独的ifs编写的版本。 if版本出现的速度有点慢。
答案 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);
这两个都应该产生相同的结果,但如果你有更多的属性,循环会更容易和更短。