【问题标题】:Condensing multiple if statements into one with PHP (for Joomla)?使用 PHP(对于 Joomla)将多个 if 语句压缩为一个?
【发布时间】:2014-05-08 15:53:33
【问题描述】:

以防万一有人不熟悉 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"; }

【问题讨论】:

  • 是的,如果您用括号更正错字,您可以。应该是if ((cond1) || (cond2) || (cond2)) 或更好的if (cond1 || cond2 || cond3)
  • Ahhh 所以 OR 语句需要在 () 内... 例如: if($this->countModules ('Top1A and Top1B' || 'Top1B and Top1C' || ' Top1A 和 Top1C') >= 1) $modCellRow2 = "col2";那正确吗?也希望你能正确回答我的问题,这样我就可以给你信用,而不是仅仅作为评论。 :P
  • 不这样不行,你需要调用countModules 3次,像这样:if ($this->countModules('Top1A and Top1B') >= 1 || $this->countModules('Top1A and Top1B') >= 1 || $this->countModules('Top1A and Top1C') >= 1)
  • 谢谢...我想我现在明白了 :)

标签: php joomla


【解决方案1】:

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

性能

对于“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",依此类推。

我写了它,所以它最容易阅读,

【讨论】:

  • 好吧,就像我说的我对 PHP 很陌生。我想我知道你在做什么 $colCount += 1; (你每次找到一个模块时都加 1,最后一个数字被用来添加到 col 的类名中)......但是,我不明白你是如何避免只计算模块总数 vs检查每个位置是否有 1 个或多个模块...这与数组和 $position 有关系吗?你能解释一下那部分吗?
  • $this->countModules($position) 将依次评估数组中的每个位置,因此 Top1A,然后是 Top1B,然后是 Top1C。如果它返回 0 = false,则 $colCount 不会增加,任何其他非零值都将评估为 true,因此 $colCount 将增加
  • 感谢您的帮助。我相信您提供了迄今为止我发现的最有效的方法。
  • 我在原始帖子中添加的修改会起作用吗? (见帖子的附加评论)
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多