2012-05-31 21 views
11

मेरे पास stdClass ऑब्जेक्ट्स की एक सरणी है और मैं उन सभी stdClass ऑब्जेक्ट्स के एक विशिष्ट फ़ील्ड का उपयोग करके अल्पविराम से अलग सूची बनाना चाहता हूं। मेरे सरणी इस तरह दिखता है:stdClass ऑब्जेक्ट्स की सरणी पर इम्प्लोड का उपयोग कैसे करें?

$obj1 = stdClass Object ([foo] => 4 [bar] => 8 [foo-bar] => 15); 
$obj1 = stdClass Object ([foo] => 16 [bar] => 23 [foo-bar] => 42); 
$obj1 = stdClass Object ([foo] => 76 [bar] => 79 [foo-bar] => 83); 

$a = array(1=>$obj1 , 2=>$obj2 , 3=>$obj3); 

और मैं सभी stdClass कि सरणी एक अल्पविराम बनाने के लिए वस्तुओं की foo पर फटना करना चाहते सूची अलग कर दिया। तो वांछित परिणाम है:

4,16,76 

वहाँ एक पाश के माध्यम से वस्तुओं के इस सरणी डाल करने के लिए बिना फटना के साथ ऐसा करना किसी भी तरह से (या कुछ अन्य रहस्य समारोह) है?

+0

शायद यदि आप ऑब्जेक्ट की toString() विधि को अधिभारित करते हैं। – clentfort

उत्तर

25

आप array_map() और implode() इस्तेमाल कर सकते हैं ...

$a = array_map(function($obj) { return $obj->foo; }, 
       array(1=>$obj1 , 2=>$obj2 , 3=>$obj3)); 

$a = implode(", ", $a); 
+0

यह एक लूप की तुलना में काम करता है और क्लीनर है, दुर्भाग्य से मुझे लगता है कि एक फोरैच लूप बेहतर प्रदर्शन करता है। मुझे array_reduce के साथ समान परिणाम मिल रहे हैं :(मान लीजिए कि मैं सिर्फ फोरच लूप के साथ रहूंगा। – ubiquibacon

0

मुझे लगता है कि सबसे आसान तरीका है एक आईडी अनुक्रमित सरणी बनाने के लिए किया जाएगा और उसके बाद फोन array_keys पर फटना:

$a = array(); 
$a[4] = stdClass Object ([foo] => 4 [bar] => 8 [foo-bar] => 15); 
$a[16] = stdClass Object ([foo] => 16 [bar] => 23 [foo-bar] => 42); 
$a[76] = stdClass Object ([foo] => 76 [bar] => 79 [foo-bar] => 83); 

echo implode(', ', array_keys($a)); 
0

नहीं है, सबसे अच्छा आप ऑब्जेक्ट पर कॉल करने के लिए, ऑर्डर पर कॉल कर सकते हैं और परिणामों को इंपोड पर कॉल करने के लिए एक नई सरणी में डाल सकते हैं।

$str = array_reduce($a, function($v, $w) { 
    if ($v) $v .= ','; 
    return $v . $w->foo; 
}); 
4

इस के लिए एक बहुत साफ समाधान array_reduce() समारोह, कि एक ही मूल्य के लिए एक सरणी को कम कर देता है।

function implodeObjValues($glue, $obj) { 
    $s = ""; 
    foreach($obj[1] as $n=>$v) { 
     $s .= $glue . $v; 
    } 
    return substr($s,strlen($glue)); 
} 

function implodeObjLabels($glue, $obj) { 
    $s = ""; 
    foreach($obj[1] as $n=>$v) { 
     $s .= $glue . $n; 
    } 
    return substr($s,strlen($glue)); 
} 

एक प्रकार के बहु-स्तर की प्रक्रिया शामिल कर सकता है, लेकिन मुझे अभी तक इसकी आवश्यकता नहीं है। उम्मीद है कि यह मदद करता है।

MySQL ऑब्जेक्ट को वापस सरणी में परिवर्तित करने के लिए सुविधाजनक।

$db = new mysqli("localhost",$usr,$pw,$db); 
$row = $db->query("SHOW TABLES"); 
$a = implodeObjValues("|",$row); 
0

यदि यह एक 1-स्तर की वस्तु है, यह मेरे लिए काम किया:

5

आप वास्तव में वर्ग पर __toString() सेट कर सकते हैं के रूप में रे ने सुझाव दिया है, लेकिन आप array पहले के माध्यम से पुनरावृति की जरूरत नहीं है। implode() ऑब्जेक्ट्स के __toString() फ़ंक्शन को सीधे कॉल करेगा (जो सहयोगी सरणी, बीटीडब्ल्यू के साथ भी काम करता है)।

6

यह वास्तव में सबसे अच्छा तरीका है जो मुझे मिला है, ऐसा लगता है कि यह सही ढंग से उत्तर नहीं दिया गया है क्योंकि वस्तुओं की सरणी गतिशील आकार को संभालने में सक्षम होना चाहिए।

$str = implode(',', array_map(function($x) { return $x->foo; }, $a)); 

यह भी मैंने देखा सबसे साफ समाधान प्रतीत होता है।