2010-08-04 4 views
5

mam obiektu:PHP: Zgrabna każdy element w obiekcie, a jeśli puste, ustawić na N/A

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

Chcę wykończenia każdego z elementów w obiekcie, a jeśli ten element jest pusty ustaw ją na 'N/A'

Więc obiektu:

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

stałby się w ten sposób:

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

W jaki sposób powinienem to zrobić, array_walk może?

+1

Funkcje 'tablica_ *' są na ogół dla tablic, a nie obiektów. W tym przypadku jednak trafia się jackpot - 'array_walk (_recursive)' i 'array_key_exists' są jedynymi, które działają z obiektami. Tak, możesz użyć 'array_walk'. – Artefacto

Odpowiedz

5

Trzymajmy go prosta:

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

A to dałoby:

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

Mam nadzieję, że jego obiekty są rzeczywiście typu 'stdClass', ponieważ gdyby był to tylko przykład, mógłby mieć problemy z tym podejściem. – Artefacto

+0

@Artefakto tak, rzeczywiście. W braku dalszych informacji zakładam, że OP ma naprawdę obiekty 'stdClass', jak pokazano. – Gordon

+0

Obiekty, o których mowa są rzeczywiście typu stdClass – k00k

1

Oto bardziej wyrafinowane (i wolniejsze), który pozwoli Ci iteracyjne nad wszystkie właściwości obiektu , niezależnie od widoczności. Wymaga to 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; 
} 

Ale nie ma takiej potrzeby, jeśli wszystkie właściwości obiektu są publiczne.

+1

Moim celem była nie tylko widoczność. Obiekt może być również Traverseable. Ale to rozwiązanie również to rozwiązuje. – Artefacto

+0

@Artefacto, możesz poprosić o sprawdzenie http://stackoverflow.com/questions/3417180/unicode-class-names-bug-or-feature (zupełnie niezwiązanego z tym pytaniem). Oceń swoją wiedzę na ten temat. – Gordon

+0

To właściwie pytanie, które wymaga trochę czasu (i może trochę badań). Sposób interpretacji skryptu zależy od tego, czy włączona jest opcja Zend Multibajt, a nawet w ustawieniach narodowych. Ten sam skrypt może nie działać na różnych komputerach, w zależności od tego, w jaki sposób przeprowadzana jest normalizacja niższej wartości nazw klas i nazw funkcji/metod. Prawdopodobnie odpowiem na to pytanie jutro, na razie muszę odpocząć: p – Artefacto

Powiązane problemy