2012-02-07 13 views
10

मैं एक बहुआयामी सरणी है:php में ऑब्जेक्ट करने के लिए multidimensional array को कैसे परिवर्तित करें?

$image_path = array('sm'=>$sm,'lg'=>$lg,'secondary'=>$sec_image); 

डायन इस तरह दिखता है:

[_media_path:protected] => Array 
      (
       [main_thumb] => http://example.com/e4150.jpg 
       [main_large] => http://example.com/e4150.jpg 
       [secondary] => Array 
        (
         [0] => http://example.com/e4150.jpg 
         [1] => http://example.com/e4150.jpg 
         [2] => http://example.com/e9243.jpg 
         [3] => http://example.com/e9244.jpg 
        ) 

      ) 

और मैं इसे एक वस्तु में तब्दील और कुंजी नाम बनाए रखना चाहते हैं।

कोई विचार?

धन्यवाद

संपादित करें: $obj = (object)$image_path; काम करने के लिए प्रतीत नहीं होता। मैं सरणी के माध्यम से पाशन और एक वस्तु बनाने का एक अलग तरीका जरूरत

+0

क्या आप हमें ऑब्जेक्ट को दिखने के लिए एक बेहतर उदाहरण दे सकते हैं? क्या आप कुंजियों को गुणों में बदलना चाहते हैं? किस उद्देश्य के लिए आपको किसी वस्तु की आवश्यकता है? – mpen

+0

'[] 'का उपयोग करने के बजाय' -> ' – Patrioticcow

उत्तर

71

एक त्वरित तरीका यह करने के लिए है:

$obj = json_decode(json_encode($array)); 

स्पष्टीकरण

json_encode($array) करने के लिए पूरे बहुआयामी सरणी में परिवर्तित कर देंगे एक JSON स्ट्रिंग। (php.net/json_encode)

json_decode($string) JSON स्ट्रिंग को stdClass ऑब्जेक्ट में परिवर्तित कर देगा। यदि आप TRUE में json_decode पर दूसरे तर्क के रूप में पास करते हैं, तो आपको एक सहयोगी सरणी मिल जाएगी। (php.net/json_decode)

मुझे नहीं लगता कि बनाम प्रदर्शन फिर से सरणी के माध्यम से जा रहा है और सबकुछ परिवर्तित करना बहुत ध्यान देने योग्य है, हालांकि मैं इसके कुछ मानक देखना चाहता हूं। यह काम करता है, और यह दूर नहीं जा रहा है।

+2

का उपयोग करने के लिए मुझे यह जवाब होना चाहिए, क्योंकि ओपी पूरी बहुआयामी सरणी चाहता है, न कि शीर्ष-स्तरीय सरणी। – AeroCross

+1

मैं कहूंगा कि यह करने का धीमा तरीका है।यदि प्रदर्शन एक चिंता है, तो मैं इस समाधान से बचूंगा। –

+0

@ कैलेबटाइलर - मैंने सुना है। मुझे बेंचमार्क के बारे में निश्चित नहीं है, लेकिन अगर मैं एक बहु-आयामी सरणी पर पुनरावर्तक पुनरावृत्ति के बीच एक गैर-मामूली अंतर होता हूं और एक वस्तु (यानी हाथ से यह पूरी चीज कर रहा हूं) या बस उपर्युक्त JSON चाल चल रहा हूं । –

6

सबसे अच्छा तरीका शुरू से ही एक वस्तु के रूप में अपने डेटा संरचना का प्रबंधन करने के लिए किया है, तो आप की क्षमता है जाएगा:

$a = (object) array(...); $a->prop = $value; //and so on 

लेकिन तेज तरीका दृष्टिकोण @CharlieS द्वारा आपूर्ति की, json_decode(json_encode($a)) का उपयोग कर किया जाएगा।

आप इसे पूरा करने के लिए एक रिकर्सिव फ़ंक्शन के माध्यम से सरणी भी चला सकते हैं। मैंने जेसन दृष्टिकोण के खिलाफ इसे बेंचमार्क नहीं किया है, लेकिन:

function convert_array_to_obj_recursive($a) { 
    if (is_array($a)) { 
     foreach($a as $k => $v) { 
      if (is_integer($k)) { 
       // only need this if you want to keep the array indexes separate 
       // from the object notation: eg. $o->{1} 
       $a['index'][$k] = convert_array_to_obj_recursive($v); 
      } 
      else { 
       $a[$k] = convert_array_to_obj_recursive($v); 
      } 
     } 

     return (object) $a; 
    } 

    // else maintain the type of $a 
    return $a; 
} 

आशा है कि मदद करता है।

संपादित करें: json_encode + json_decode वांछित के रूप में एक वस्तु बना देगा। लेकिन, यदि सरणी संख्यात्मक या मिश्रित अनुक्रमणिका (उदाहरण के लिए array('a', 'b', 'foo'=>'bar')) थी, तो आप ऑब्जेक्ट नोटेशन (उदाहरण के लिए $ o-> 1 या $ o [1]) के साथ संख्यात्मक अनुक्रमणिका का संदर्भ नहीं दे पाएंगे। उपरोक्त फ़ंक्शन सभी संख्यात्मक इंडेक्स को 'इंडेक्स' प्रॉपर्टी में रखता है, जो स्वयं ही एक संख्यात्मक सरणी है। तो, आप $o->index[1] करने में सक्षम होंगे। यह एक निर्मित ऑब्जेक्ट से एक परिवर्तित सरणी का भेद रखता है और उन वस्तुओं को मर्ज करने के विकल्प को छोड़ देता है जिनमें संख्यात्मक गुण हो सकते हैं।

+0

रिकर्सिव फ़ंक्शन प्रदान करने के लिए धन्यवाद, मुझे लगता है कि इस पर ठोकर खाने वाले बहुत से लोगों के लिए शायद मददगार है। मैं PHP स्रोत कोड को देखने के लिए जा रहा हूं यह देखने के लिए कि json_encode/decode प्रदर्शन के संदर्भ में कैसे तुलना करता है। मैं उत्सुक हूँ। –

+1

आप वस्तुओं पर संख्यात्मक गुणों को '$ o -> {1}' के माध्यम से संदर्भित कर सकते हैं। –

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