2010-08-04 16 views
5

I tienen un objeto:PHP: Recorte cada elemento en un objeto y si está vacía, se establece en N/A

stdClass Object 
(
    [Color] => Red 
    [Shape] => Round 
    [Taste] => Sweet 
) 

quiero para recortar cada uno de los elementos en el objeto y si ese elemento está vacío, configurarlo para 'N/a'

Así que este objeto:

stdClass Object 
(
    [Color] => Red 
    [Shape] => 
    [Taste] => Sweet 
) 

se convertiría en esto:

stdClass Object 
(
    [Color] => Red 
    [Shape] => N/A 
    [Taste] => Sweet 
) 

¿Cómo debo lograr esto, array_walk quizás?

+1

'array_ *' funciones son generalmente para matrices, no objetos. En este caso, sin embargo, aciertas el jackpot - 'array_walk (_recursive)' y 'array_key_exists' son los únicos que funcionan con objetos. Entonces, sí, puedes usar 'array_walk'. – Artefacto

Respuesta

5

Vamos a mantenerlo simple:

$foo = new StdClass; 
$foo->prop1 = ' foo '; 
$foo->prop2 = NULL; 
$foo->prop3 = 'bar'; 

foreach($foo as &$prop) { 
    $prop = trim($prop); 
    if (empty($prop)) { 
     $prop = 'N/A'; 
    } 
} 

print_r($foo); 

Y eso le daría:

stdClass Object 
(
    [prop1] => foo 
    [prop2] => N/A 
    [prop3] => bar 
) 
+1

Espero que sus objetos sean en realidad del tipo 'stdClass', porque si solo fuera un ejemplo, podría tener problemas con este enfoque. – Artefacto

+0

@Artefacto sí, de hecho. A falta de más información, supongo que el OP realmente tiene objetos 'stdClass' como se muestra. – Gordon

+0

Los objetos en cuestión son de hecho de tipo stdClass – k00k

1

Aquí es uno más sofisticados (y más lento) que le permitiría a iterar sobre todas las propiedades de un objeto , independientemente de la visibilidad. Esto requiere PHP5.3:

function object_walk($object, $callback) { 

    $reflector = new ReflectionObject($object); 
    foreach($reflector->getProperties() as $prop) { 
     $prop->setAccessible(TRUE); 
     $prop->setValue($object, call_user_func_array(
      $callback, array($prop->getValue($object)))); 
    } 
    return $object; 
} 

Pero no hay necesidad de utilizar esto si todas las propiedades de sus objetos son públicas.

+1

Mi punto no era solo la visibilidad. El objeto también podría ser Traversable. Pero esta solución también aborda eso. – Artefacto

+0

@Artefacto, puedo pedirle que eche un vistazo a http://stackoverflow.com/questions/3417180/unicode-class-names-bug-or-feature (sin relación con esta pregunta). Valora tu experiencia en eso. – Gordon

+0

Esa es una pregunta que requiere cierto tiempo (y quizás algo de investigación). La forma en que se interpreta el guión depende de si la opción zend multibyte está habilitada e incluso en la configuración regional. Es posible que la misma secuencia de comandos no funcione en diferentes máquinas, dependiendo de cómo se realiza la normalización de minúsculas en los nombres de clase y nombres de función/método. Probablemente responda la pregunta mañana, por ahora debo descansar: p – Artefacto

Cuestiones relacionadas