2011-08-16 12 views
0

好奇心から外に条件文を書くよりエレガントな方法があるのでしょうか?私はそれを書くのにもっと短い方法を見ることができませんが、それはかなりclunkyと感じるので、どんな提案も歓迎です!これらの条件を書くよりエレガントな方法は?

 // 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(); 
     } 

答えて

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に触れませんでした。このコードでは0に設定されます。

- >すべての>親、ただし、ターミネーターが必要です。

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

それが一致したことがない場合、これは永遠に実行することができますが、私は、終了条件を示唆するようにアプリケーションについて十分に知らない - あなたはカウンター、または何か他のものを追加することができます。

+0

ほとんどがちょうど圧縮されたバージョンです。 – Seldaek

0

変数に$this->pageを割り当てて、それを使ってステートメントを開始することができます。

また、ネストされた3進文を作成して$visualを割り当てることもできますが、これはお勧めできません。

1

代わりにループを書くことができます。

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

を、私は、これは同等であると信じ、および/あなたが持っているネストどのように多くの親のレベルに関係なく動作します。

0

再帰的なアプローチ:あなたはどんなクラス$this->pageを制御している場合は

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); 

はのインスタンスである場合、あなたはそれのインスタンスメソッドにすることができます。

0

これらの厄介な条件を取り除く再帰的な方法を作ることができます。また、処理時間を2倍にする条件分岐ごとにfind_all()メソッドを2回呼び出します。

ここでは再帰関数を試しています(再帰関数は常に難しいですが!)無限ループに注意してください。

<?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(); 
     } 
    } 
} 
?> 
0

あなたはあなたのコード内で2つの変更を行いたい場合があります:

  • がnullのオブジェクトを作る考えてみましょう何のビジュアルが存在しないgetVisualsは()の場合にはNULLの代わりに空の配列を返すことを確認してください

    1. を - ビジュアルを持たず、それ自体を親として持つシングルトンページインスタンス。指定されたページがヌルページであるかどうかを簡単にテストできるように、isNull()のようなメソッドがあります。

    2つの調整を行うと、ビジュアルに関するコードのほとんどが書き込みとデバッグが容易になります。

    二つのレベル(私はあなたが再帰をしたくないと仮定)のためのすべてのビジュアル行き方:

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

    は、ページのOR親の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()); 
    }