2012-08-30 41 views
10

संभव डुप्लिकेट के रूप में साहचर्य सरणी:
Convert Array to Object PHPपीएचपी - एक वस्तु

मैं एक सरल PHP आवेदन बना रहा हूं और मैं एक डाटा संग्रहण के रूप में YAML फ़ाइलों का उपयोग करना चाहते हैं। मैं उदाहरण के लिए इस संरचना के साथ, एक साहचर्य सरणी के रूप में डेटा प्राप्त होगा:

$user = array('username' => 'martin', 'md5password' => '5d41402abc4b2a76b9719d911017c592') 

हालांकि, मैं कुछ कार्यों के साथ साहचर्य सरणी का विस्तार करने और -> ऑपरेटर का उपयोग करना चाहते हैं, तो मैं कुछ इस तरह लिख सकते हैं:

$user->username = 'martin'; // sets $user['username'] 
$user->setPassword('hello'); // writes md5 of 'hello' to $user['md5password'] 
$user->save();    // saves the data back to the file 

क्या कक्षा परिभाषा के बिना ऐसा करने का कोई अच्छा तरीका है?

असल में, मैं PHP में जावास्क्रिप्ट शैली वस्तुओं करना चाहते हैं :)

+4

चाहिए इन दिनों कम से कम sha1 का उपयोग करें। – wesside

+2

+ वेसाइड 2016 अपडेट: SHA512 के साथ password_hash या PBKDF2 के माध्यम से BCrypt। – mjsa

+0

@mjsa रास्ता देखने के लिए रास्ता! – wesside

उत्तर

4

सचमुच सिर्फ एक $class = new stdClass; बनाने के लिए और पुनरावृति और पुन: असाइन। ध्यान रखें कि टाइपकास्टिंग की तरह यह केवल एक स्तर गहरा है। इसे सब कुछ प्राप्त करने के लिए आपको एक रिकर्सिव इटरेटर लिखना होगा। मुझे याद है कि कोहाना 2/3 में to_object() है जिसका आप शायद उपयोग कर सकते हैं।

यह मिला:

class Arr extends Kohana_Arr { 

    public static function to_object(array $array, $class = 'stdClass') 
    { 
      $object = new $class; 
      foreach ($array as $key => $value) 
      { 
        if (is_array($value)) 
        { 
        // Convert the array to an object 
          $value = arr::to_object($value, $class); 
        } 
        // Add the value to the object 
        $object->{$key} = $value; 
      } 
      return $object; 
    } 
+2

नोट यह अनुक्रमिक (गैर-सहयोगी) सरणी वस्तुओं को भी परिवर्तित करेगा। हो सकता है कि आप इस उत्तर के साथ गठबंधन करना चाहें: http://stackoverflow.com/a/4254008/1074400 –

27

बस इसे डाली:

$user = (object)$user; 
बेशक

, वहाँ अन्य, एक वर्ग को लागू करने वाली बनाने की तरह और अधिक लचीला समाधान कर रहे हैं ArrayAccess:

$user = new User(); // implements ArrayAccess 

echo $user['name']; 
// could be the same as... 
echo $user->name; 
+0

ध्यान दें कि यदि $ उपयोगकर्ता 'शून्य' है, तो इसे '(ऑब्जेक्ट)' पर कास्टिंग करने से यह शून्य हो जाएगा (यह होगा एक खाली वस्तु हो)। इससे बचने के लिए आप यह कर सकते हैं: '$ user = $ उपयोगकर्ता? (ऑब्जेक्ट) $ उपयोगकर्ता: शून्य ' –