写这些条件更优雅的方式?

时间:2011-08-16 07:28:20

标签: php

出于好奇,我想知道是否有一种更优雅的方式来编写下面的条件?我看不到更短的写作方式,但感觉非常笨重,所以任何建议都欢迎!

        // Check whether this page has any visuals
        if (count($this->page->pagevisuals->find_all()) > 0)
        {
            // Ok to go ahead and assign
            $visual = $this->page->pagevisuals->find_all();
        }
        // If this is a sub page, parent page may have visuals we can use
        elseif (count($this->page->parent->pagevisuals->find_all()) > 0)
        {
             $visual = $this->page->parent->pagevisuals->find_all();
        }
        // If two levels deep, grandparent page might have visuals
        elseif (count($this->page->parent->parent->pagevisuals->find_all()) > 0)
        {
            $visual = $this->page->parent->parent->pagevisuals->find_all();
        }

6 个答案:

答案 0 :(得分:1)

你可以写一个循环:

$page = $this->page;
$visual = null;
while (!$visual && $page) {
    $visual = $page->pagevisuals->find_all();
    $page = $page->parent;
}

我相信这是相同的,无论你有多少级别的父母/筑巢,都会有效。

答案 1 :(得分:0)

$visual = $this->page->pagevisuals->find_all()
or $visual = $this->page->parent->pagevisuals->find_all()
or $visual = $this->page->parent->parent->pagevisuals->find_all();

如果它们都不匹配,你会怎么做?在此代码中,它将被设置为最后一个,这与您所做的不同。 (在您的代码中,如果没有匹配,则不会触及$ visual,在此代码中它将被设置为零。您可以添加or $visual = -1或类似的东西。)

如果您想避开所有 - >父级,可以进行循环,但是您需要一些终结符。

$el = $this->page;
while(!$visual = $el->pagevisuals->find_all()) {
  $el = $el->parent;
}

如果它永远不匹配,这可以永远运行,但我不太了解您的应用程序建议终止条件 - 您可以添加计数器,或其他。

答案 2 :(得分:0)

您可以将$this->page分配给变量并使用该变量开始语句,以获得非常小的改进。

或者,您可以创建嵌套的三元语句来分配$visual,但这肯定不是建议的做法。

答案 3 :(得分:0)

递归方法:

function getVisuals($root) {
    $visuals = $root->pagevisuals->find_all();
    if(count($visuals) === 0 && isset($root->parent)) {
        $visuals = getVisuals($root->parent);
    }
    return $visuals;
}

$visuals = getVisuals($this->page);

如果您可以控制任何类$this->page的实例,那么您可以将其作为实例方法。

答案 4 :(得分:0)

你可以制作一个递归方法来摆脱那些讨厌的条件。此外,您为每个条件分支调用find_all()方法两次,这会使处理时间加倍。

这是对递归函数的尝试(可能不起作用,递归函数总是有点棘手!)。小心无限循环。

<?php
$visual = $this->page->find_all_visuals();

class Page {
    function find_all_visuals()
    {
        $found = $this->pagevisuals->find_all();

        if (count($found) > 0) {
            return $found;
        } else if ($this->parent == null) {
            return null;
        } else {
            return $this->parent->find_all_visuals();
        }
    }
}
?>

答案 5 :(得分:0)

您可能希望在代码中进行两项更改:

  1. 确保getVisuals()返回空数组而不是null,以防没有视觉效果
  2. 考虑制作一个空对象 - 一个没有视觉效果并且自己作为父视图的单例页面实例。它可能有一个类似于isNull()的方法,因此您可以轻松地测试给定页面是否为空页。
  3. 如果进行了两次调整,大部分有关视觉效果的代码将变得更容易编写和调试。

    获取两个级别的所有视觉效果(我假设您不需要递归):

    $visuals = array_merge(
        $this->page->pagevisuals->find_all(),
        $this->page->parent->pagevisuals->find_all(),
        $this->page->parent->parent->pagevisuals->find_all(),
    );
    

    获取页面的视觉效果或祖父的父OR的视觉效果:

       ($visuals = $this->page->pagevisuals->find_all()) ||
       ($visuals = $this->page->parent->pagevisuals->find_all()) ||
       ($visuals = $this->page->parent->parent->pagevisuals->find_all());
    

    递归函数也会更简单(这是一种添加到页面对象的方法):

    public function findRecursive(){
        $my_visuals = $this->pagevisuals->find_all()
        return $this->parent->isNull()?
                   $my_visuals
                   : array_merge($my_visuals, $this->parent->findRecursive());
    }