2010-08-04 19 views
5

bir nesne vardır/N olarak ayarlanmış, bir nesne ve boş ise her eleman kısaltma:PHP bir

I nesne ve bu elemanın boş ise elemanlarının her kırpmak istediğiniz
stdClass Object 
(
    [Color] => Red 
    [Shape] => Round 
    [Taste] => Sweet 
) 

, 'N/A'

olarak ayarlayın Yani bu nesne:

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

bu hale misiniz:

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

Bunu nasıl gerçekleştirmeliyim, array_walk belki?

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

Ve bu verecekti:

+1

'array_ *' işlevler genellikle nesneler değil, nesneler içindir. Bu durumda, ancak, jackpot çarptı - 'array_walk (_recursive)' ve 'array_key_exists' nesneleri ile çalışan sadece onlar. Evet, 'array_walk' kullanabilirsiniz. – Artefacto

cevap

5

en basit tutmak edelim

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

Umarım onun nesneleri aslında stdClass türündedir, çünkü eğer sadece bir örnek olsaydı, bu yaklaşımda sorun yaşayabilirdi. – Artefacto

+0

@Artefacto evet, gerçekten. Daha fazla bilgi eksikliğinden dolayı OP'nin gerçekten gösterildiği gibi stdClass' nesnelerine sahip olduğunu farz ediyorum. – Gordon

+0

Söz konusu nesneler gerçekten stdClass türü – k00k

1

bir nesnenin tüm özellikleri üzerinde yineleme olanak sağlayacak bir daha sofistike (ve yavaş) biridir Görünürlükten bağımsız olarak. Bu PHP5.3 gerektirir:

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

Ama tüm nesne özellikleri kamu eğer bu kullanmaya gerek yoktur.

+1

adresinde söyledikleri gibi, benim için yalnızca görünürlük değildi. Nesne ayrıca Traversable olabilir. Ama bu çözüm de buna cevap veriyor. – Artefacto

+0

@Artefacto, http://stackoverflow.com/questions/3417180/unicode-class-names-bug-or-feature adresinden (bu soruyla tamamen ilgisiz) ilgilenmenizi isteyebilir. Uzmanlığınıza değer verin. – Gordon

+0

Aslında bu biraz zaman gerektiren bir soru (ve belki biraz araştırma). Komut dosyası nasıl yorumlanır, zend çok baytlı seçeneğinin etkinleştirilip etkinleştirilmediğine ve hatta yerel ayarda olmasına bağlıdır. Aynı betik, sınıf adlarında ve işlev/yöntem adlarındaki küçük harfli normalleştirmenin nasıl yapıldığına bağlı olarak farklı makinelerde çalışmayabilir. Muhtemelen soruyu yarın cevaplayacağım, şimdilik dinlenmeliyim: p – Artefacto