2011-03-02 18 views
6

Ho uno script php piuttosto grande che utilizza il ciclo foreach piuttosto spesso. Il modo in cui funziona ora è passare una serie di oggetti su ogni ciclo foreach, ma voglio modificare lo script per lavorare anche solo con un oggetto. Oserei davvero e non penso sia ragionevole controllare prima di ogni ciclo se si tratta di un array di oggetti o solo di un singolo oggetto e, a seconda della situazione, di scorrere l'array o semplicemente fare cose con il singolo oggetto. Qualche soluzione alternativa? Grazie in anticipoPHP foreach su array di oggetti E singolo oggetto?

+0

Direi che se in più punti nello script non sei sicuro che tu stia lavorando su un singolo oggetto o una serie di oggetti hai un problema nel definire correttamente il tuo flusso di dati. – deceze

risposta

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

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

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

Schema estremamente comune in PHP, trovo lo – meagar

0

Suona come è necessario scrivere una funzione/Sarebbe questo per i propri scopi?

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

Questo era quello che stavo cercando di evitare, se avessi almeno un paio di dozzine di cicli foreach e aggiungendo. Mi dispiacerebbe avvolgere ogni contenuto del ciclo foreach in una funzione. Grazie comunque. – pHelics

1

È possibile passare una matrice con un singolo oggetto al suo interno. O utilizzare una funzione di costruzione/funzione polimorfica.

Passaggio di un array con un singolo oggetto è abbastanza evidente come farlo, ecco alcuni altri modi possibili per affrontarla:

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); 
    } 
} 
Problemi correlati