2010-08-04 5 views
5

मैं एक वस्तु है:PHP: एक वस्तु में और खाली है, तो हर तत्व ट्रिम, एन करने के लिए सेट/ए

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

मैं वस्तु में और अगर उस तत्व रिक्त है तत्वों में से प्रत्येक ट्रिम करना चाहते, 'एन/ए'

के लिए सेट तो यह वस्तु:

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

इस बन गयी:

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

मुझे यह कैसे पूरा करना चाहिए, array_walk शायद?

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

और वह देना होगा:

+1

'array_ *' फ़ंक्शन आमतौर पर सरणी के लिए होते हैं, ऑब्जेक्ट्स नहीं। इस मामले में, हालांकि, आपने जैकपॉट - 'array_walk (_recursive)' और 'array_key_exists' को हिट किया है जो ऑब्जेक्ट्स के साथ काम करते हैं। तो, हाँ, आप 'array_walk' का उपयोग कर सकते हैं। – Artefacto

उत्तर

5

के यह सरल रखने के चलो

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

मुझे आशा है कि उनकी वस्तुएं वास्तव में 'stdClass' प्रकार की हैं, क्योंकि यदि यह केवल एक उदाहरण था, तो उन्हें इस दृष्टिकोण से परेशानी हो सकती है। – Artefacto

+0

@Atetefacto हाँ, वास्तव में। आगे की जानकारी की कमी में मुझे लगता है कि ओपी वास्तव में दिखाए गए अनुसार 'stdClass' ऑब्जेक्ट्स है। – Gordon

+0

प्रश्न में वस्तुएं वास्तव में टाइप की गई हैं stdClass – k00k

1

यहाँ एक और अधिक परिष्कृत (और धीमी) एक है कि आप एक वस्तु के सभी गुण से अधिक पुनरावृति करने की अनुमति होगी है दृश्यता के बावजूद। इसके लिए 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; 
} 

लेकिन यदि आपके सभी ऑब्जेक्ट गुण सार्वजनिक हैं तो इसका उपयोग करने की आवश्यकता नहीं है।

+1

में मेरी बात न केवल दृश्यता थी। ऑब्जेक्ट ट्रैवर्सबल भी हो सकता है। लेकिन यह समाधान भी संबोधित करता है। – Artefacto

+0

@Artefacto क्या मैं आपको http://stackoverflow.com/questions/3417180/unicode-class-names-bug-or-feature (इस प्रश्न से पूरी तरह से संबंधित नहीं) पर एक नज़र डालने के लिए कह सकता हूं। इस पर अपनी विशेषज्ञता का मूल्यांकन करें। – Gordon

+0

यह वास्तव में एक प्रश्न है जिसके लिए कुछ समय (और शायद कुछ शोध) की आवश्यकता है। स्क्रिप्ट का व्याख्या कैसे किया जाता है इस पर निर्भर करता है कि ज़ेंड मल्टीबाइट विकल्प सक्षम है और यहां तक ​​कि लोकेल पर भी। क्लास नामों और फ़ंक्शन/विधि नामों पर लोअरकासिंग सामान्यीकरण कैसे किया जाता है, इस पर निर्भर करता है कि एक ही स्क्रिप्ट अलग-अलग मशीनों में काम नहीं कर सकती है। मैं कल कल सवाल का जवाब दूंगा, क्योंकि अब मुझे आराम करना होगा: पी – Artefacto