2011-03-02 12 views
6

Tengo un script php bastante grande que usa el bucle foreach con bastante frecuencia. La forma en que funciona ahora es pasar una matriz de objetos a cada ciclo foreach, pero quiero modificar el script para que funcione solo con un objeto también. Realmente odiaría y no creo que sea razonable verificar antes de cada bucle si se trata de una matriz de objetos o solo un objeto y, dependiendo de la situación, recorrer la matriz o simplemente hacer cosas con el único objeto. ¿Alguna solución alternativa? Gracias de antemanoPHP foreach en array of objects AND single object?

+0

Yo diría que si en múltiples puntos de la secuencia de comandos no está Asegúrese de que si está trabajando en un solo objeto o en una matriz de objetos, tiene un problema para definir correctamente su flujo de datos. – deceze

Respuesta

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

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

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

Patrón extremadamente común en PHP, encuentro – meagar

0

suena como tiene que escribir una función/¿Sería esto servir a sus propósitos?

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

Eso era lo que estaba tratando de evitar, si tengo al menos un par de docenas de bucles foreach y los agrego. Odiaría envolver todos los contenidos de bucle foreach en una función. Gracias de cualquier manera. – pHelics

1

Puede pasar una matriz con un solo objeto dentro de ella. O use una configuración de constructor/función polimórfica.

Pasar una matriz con un único objeto es bastante obvio cómo hacerlo, aquí hay algunas otras formas posibles de tratar con él:

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