2010-08-04 1 views
5

Ich habe ein Objekt:PHP: jedes Element in einem Objekt-Ordnung und wenn leer, auf N/A

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

I jedes der Elemente in dem Objekt zu trimmen, und wenn das Element leer ist, setzen sie ihn auf 'N/A'

Also das Objekt:

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

Würde dies geworden:

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

Wie soll ich das erreichen, array_walk vielleicht?

+1

'Array_ *' Funktionen sind in der Regel für Arrays, keine Objekte. In diesem Fall haben Sie jedoch den Jackpot geknackt - 'array_walk (_recursive)' und 'array_key_exists' sind die einzigen, die mit Objekten arbeiten. Also, ja, Sie können 'array_walk' verwenden. – Artefacto

Antwort

5

Sagen wir es einfach halten:

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

Und das würde:

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

Ich hoffe, dass seine Objekte vom Typ 'stdClass' sind, denn wenn es nur ein Beispiel wäre, könnte er Probleme mit diesem Ansatz haben. – Artefacto

+0

@Artefacto ja, tatsächlich. In Ermangelung weiterer Informationen nehme ich an, dass das OP wirklich "stdClass" -Objekte wie gezeigt hat. – Gordon

+0

Die fraglichen Objekte sind in der Tat vom Typ stdClass – k00k

1

Hier ist eine anspruchsvollere (und langsamer) ein, dass Sie alle Eigenschaften eines Objekts iterieren erlauben würde, , unabhängig von der Sichtbarkeit. Dies erfordert 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; 
} 

Aber es gibt keine Notwendigkeit, dies zu nutzen, wenn alle Objekteigenschaften sind öffentlich.

+1

Mein Punkt war nicht nur die Sichtbarkeit. Das Objekt könnte auch Traversable sein. Aber diese Lösung spricht auch das an. – Artefacto

+0

@Artefacto darf ich Sie bitten, http://stackoverflow.com/questions/3417180/unicode-class-names-bug-or-feature (völlig unabhängig von dieser Frage) zu sehen. Bewerten Sie Ihr Fachwissen darauf. – Gordon

+0

Das ist eigentlich eine Frage, die einige Zeit (und vielleicht einige Nachforschungen) erfordert. Wie das Skript interpretiert wird, hängt davon ab, ob die Zend-Multibyte-Option aktiviert ist und sogar für das Gebietsschema. Das gleiche Skript funktioniert möglicherweise nicht auf verschiedenen Computern, je nachdem, wie die Normalisierung der Klassennamen und Funktions-/Methodennamen durchgeführt wird. Ich werde wahrscheinlich die Frage morgen beantworten, denn jetzt muss ich mich ausruhen: p – Artefacto

Verwandte Themen