2012-09-01 15 views
7

संभव डुप्लिकेट वस्तु में कनवर्ट कर रहा:
Casting an Array with Numeric Keys as an Objectएक अनुक्रमित सरणी

मैं (object) के बारे में प्रकार कास्टिंग सोच रहा था।

यह एक वस्तु के लिए एक साहचर्य सरणी परिवर्तित करने की तरह है, उपयोगी के लिए बहुत कुछ करना संभव नहीं है, और कुछ तो उपयोगी और थोड़ा अजीब (IMHO) बातें, converting a scalar value to object की तरह नहीं।

लेकिन मैं अनुक्रमित सरणी के कास्टिंग के परिणाम तक कैसे पहुंच सकता हूं?

// Converting to object an indexed array 
$obj = (object) array('apple', 'fruit'); 

एक विशिष्ट मूल्य तक पहुंचने के बारे में कैसे?

print $obj[0];  // Fatal error & doesn't have and any sense 
print $obj->scalar[0]; // Any sense 
print $obj->0;  // Syntax error 
print $obj->${'0'};  // Fatal error: empty property. 
print_r(get_object_vars($obj)); // Returns Array() 

print_r($obj); /* Returns 
        stdClass Object 
        (
          [0] => apple 
          [1] => fruit 
        ) 
        */ 

निम्नलिखित काम करता है क्योंकि stdClass लागू गतिशील Countable और ArrayAccess:

foreach($obj as $k => $v) { 
    print $k . ' => ' . $v . PHP_EOL; 
} 

उत्तर

3

यह वास्तव में एक reported bug है।

इसे "बहुत महंगा ठीक करने के लिए" संकल्प दिया "प्रलेखन इस बेकार मोड़ वर्णन करने के लिए अद्यतन किया, तो यह अब आधिकारिक तौर पर सही व्यवहार है" [1] है समझा जाता है और।

हालांकि, कुछ वर्कअराउंड हैं।

get_object_vars के रूप में आप कुछ भी नहीं देता है, केवल एक चीज आप कर सकते है:

  1. आप foreach
  2. का उपयोग कर आप सरणी के रूप में इसे वापस डाल सकता stdClass पर पुनरावृति कर सकते हैं।
  3. आप json_decode + json_encode (यह गंदा चाल है)

उदाहरण का उपयोग करते हुए आपत्ति उठाने का यह डाली पर बदल सकता है 1 .:

$obj = (object) array('apple', 'fruit'); 
foreach($obj as $key => $value) { ... 

उदाहरण 2 .:

$obj = (object) array('apple', 'fruit'); 
$array = (array) $obj; 
echo $array[0]; 

उदाहरण 3।:

$obj = (object) array('apple', 'fruit');  
$obj = json_decode(json_encode($obj));  
echo $obj->{'0'}; 
var_dump(get_object_vars($obj)); // array(2) {[0]=>string(5) "apple"[1]=>string(5)"fruit"} 

यही कारण है कि आप :) वस्तु के रूप में

गैर साहचर्य सरणी डाली नहीं करनी चाहिए लेकिन अगर आप चाहते हैं, इस तरह से यह करने के लिए:

// PHP 5.3.0 and higher 
$obj = json_decode(json_encode(array('apple', 'fruit'), JSON_FORCE_OBJECT)); 
// PHP 5 >= 5.2.0 
$obj = json_decode(json_encode((Object) array('apple', 'fruit'))); 

$obj = (Object) array('apple','fruit'); 
+0

उत्तर देने के लिए धन्यवाद। मुझे पता है कि यह गंदे है और मैं कभी भी अनुक्रमित सरणी नहीं डालूंगा ... लेकिन मैं उत्सुक हूं :-) मैं ऐसा करने के लिए _clean_ तरीका ढूंढ रहा था, सिर्फ एक कामकाज नहीं। [मैट्यू] के बाद (http://stackoverflow.com/users/259778/matthew) ने मुझे डुप्लिकेट प्रश्न के बारे में देखा, मैंने स्वीकृत उत्तर पढ़ा और आपको एक संपादन का सुझाव दिया। –

संबंधित मुद्दे