使用PHP将多个if语句压缩为一个(对于Joomla)?

使用PHP将多个if语句压缩为一个(对于Joomla)?,php,joomla,Php,Joomla,万一有人不熟悉Joomla,countModules是内置的函数。请记住,我对PHP不是很熟悉。。而且我对使用它还比较陌生。请尽量使任何解决方案简单易懂。谢谢 我的问题是,我能否将其浓缩: if($this->countModules('Top1A and Top1B') >= 1) $modCellRow1 = "col2"; if($this->countModules('Top1B and Top1C') >= 1) $modCellRow1 = "col2"; i

万一有人不熟悉Joomla,countModules是内置的函数。请记住,我对PHP不是很熟悉。。而且我对使用它还比较陌生。请尽量使任何解决方案简单易懂。谢谢

我的问题是,我能否将其浓缩:

if($this->countModules('Top1A and Top1B') >= 1) $modCellRow1 = "col2";
if($this->countModules('Top1B and Top1C') >= 1) $modCellRow1 = "col2";
if($this->countModules('Top1A and Top1C') >= 1) $modCellRow1 = "col2";
为此:

if ($this->countModules('Top1A and Top1B') >= 1) || ($this->countModules('Top1A and Top1B') >= 1) || ($this->countModules('Top1A and Top1C') 
{
$modCellRow1 = "col2";
}
如果你知道Joomla和countModules。。。或者,即使你没有,请记住,我正在检查每个模块位置中是否有任何内容,而不是计算实际模块的数量。换句话说,我确实需要使用AND作为运算符。另外,我不想包括所有这三行,因为这是我代码中的另一行。。。例如:

if($this->countModules('Top1B and Top1B and Top1C') >= 1) $modCellRow1 = "col3";
我要检查的是,其他语句中是否只有两个模块位置。。。(即三个中只有两个等于或大于一个……但不是全部三个)

附加评论/问题:

这样行吗

$topRow1Count = 0;
foreach(array('Top1A','Top1B','Top1C','Top1D') as $position) {
    if ($this->countModules($position)) {$colCount += 1;}
}
$modColCountTopRow1 = "col" . $topRow1Count;
if ($topRow1Count == 0) { $modTopRow1 = " hidden"; }

$topRow2Count = 0;
foreach(array('Top2A','Top2B','Top2C','Top2D') as $position) {
    if ($this->countModules($position)) {$colCount += 1;}
}
$modColCountTopRow2 = "col" . $topRow2Count;
if ($topRow2Count == 0) { $modTopRow2 = " hidden"; }

if ($topRow1Count + $topRow2Count == 0) { $topModCont1 = " hidden"; }

是的,它会起作用的。但是让我们考虑一下性能和可读性。 性能

对于“col2”案例,您将调用
countModules
3次,对于“col3”案例,您将调用一次,假设您从“col1”开始,则将调用4次,每个调用都有多个“位置”进行检查。 现在,
countModules()
代码得到了非常优化,返回到一个静态类,它不会在每次迭代时查询数据库;但即使是在一个只有很少模块的小网站上,你的程序仍然比它应该的速度慢10倍

可读性和代码质量

您可能已经读到,代码不应该看起来像是被复制和粘贴的。这是有意义的,至少因为它更容易阅读避免重复的代码,此外,它也不太容易出现打字错误

本着压缩多个语句的精神,而不是连接行,为什么不考虑:

$colCount = 0;
foreach(array('Top1A','Top1B','Top1C') as $position) {
    if ($this->countModules($position)) {
        $colCount += 1;
    }
}
$modCellRow1 = "col" . $colCount;
如果没有模块位于任何位置,则返回
“col0”
,如果模块仅位于一个位置,则返回
“col1”
,依此类推


我写它是为了让它更容易阅读,

是的,如果你用括号纠正打字错误,你可以。应该是
if((cond1)|(cond2)|(cond2))
或者更好的
if(cond1 | | cond2 | | cond3)
。。。例如:如果($this->countModules('Top1A和Top1B'| | |'Top1B和Top1C'| |'Top1A和Top1C')>=1)$modCellRow2=“col2”;是这样吗?也希望你能正确地回答我的问题,这样我就可以给你荣誉,而不仅仅是一个评论PNo这不对,您需要调用
countModules
3次,就像这样:
if($this->countModules('Top1A和Top1B')>=1 | |$this->countModules('Top1A和Top1B')>=1)
谢谢。。。我想我现在明白了:)就像我说的,我对PHP非常陌生。我想我知道你用$colCount+=1做什么了;(每次它找到一个模块时,您将添加1,最后的数字将用于添加到col的类名中)。。。然而,我不明白你是如何避免仅仅计算模块的总数而不是检查每个职位中是否有一个或多个模块。。。这与数组和$position有关吗?你能解释一下这一部分吗?$this->countModules($position)将依次对数组中的每个位置进行求值,然后是Top1A、Top1B、Top1C。如果它返回0=false,$colCount将不会递增,任何其他非零值将计算为true,因此$colCount将递增感谢您的帮助。我相信你提供了迄今为止我发现的最有效的方法。我会在我原来的帖子中添加修改吗?(见帖子的补充评论)