2011-03-02 11 views
6

私はかなり頻繁にforeachループを使用するかなり大きなPHPスクリプトを持っています。今のところ動作する方法は、すべてのforeachループにオブジェクトの配列を渡すことですが、オブジェクトだけで動作するようにスクリプトを変更したいと思います。私は本当に嫌いだし、オブジェクトの配列か単なるオブジェクトであればループの前にチェックするのは妥当ではないと思うし、配列をループする状況や単一のオブジェクトで処理する状況にもよる。 これを回避するには?あなたは、これはあなたの目的を果たすだろう/関数を記述する必要があるように、事前オブジェクトの配列と単一オブジェクトのPHP foreach?

+0

私が言うと思いますデータフローを正しく定義する上で問題がある単一のオブジェクトまたはオブジェクトの配列のどちらで作業しているのかを確認してください。 – deceze

答えて

16
$item = $obj; 
// or 
$item = array(...); 

if(!is_array($item)) 
    $item = array($item); 

foreach($item as $individual) 
{ 
    //... 
} 
+0

PHPで非常に一般的なパターン、私は見つけた – meagar

0

で おかげでね?

if(is_array($thingy)){ 
    foreach($thingy as $thing){ 
     function($thing); 
    } 
}else{ 
    function($thingy); 
} 
+0

これは、少なくとも数十数のforeachループを追加している場合は、私が避けようとしていたものでした。関数内のすべてのforeachループの内容をラップするのは嫌です。とにかくありがとう。 – pHelics

1

1つのオブジェクトを内部に持つ配列を渡すことができます。または、多態的なコンストラクタ/関数の設定を使用します。単一のオブジェクトの配列を渡す

はここでそれに対処するためのいくつかの他の可能な方法があります、それを行う方法はかなり明白です:スクリプト内の複数のポイントであなたがいないのであれば

function test($var) 
{ 
    if(is_a($var,"ClassName")) //Test to see if the passed variable is a member of the class and not an array and put it in an array if so 
    { 
      $var = array($var); 
    } 

    foreach($var as $v) 
    { 
      //Do stuff 
    } 
} 

function test($var) 
{ 
    if(is_array($var)) //Test if object is array or class, call different functions depending on which it is 
    { 
     call_user_func_array(array($this,'doArray'),$var); 
    } 
    elseif(is_a($var,"Classname")) 
    { 
     call_user_func_array(array($this,'doObject'),$var); 
    } 
} 
関連する問題