मैं किसी ऑब्जेक्ट को सरणी में कैसे बदलूं?


204
<?php
   print_r($response->response->docs);
?>

निम्नलिखित आउटपुट:

    Array 
(
    [0] => Object 
            (
                [_fields:private] => Array 
                                    (
                                        [id]=>9093 
                                        [name]=>zahir
                                    ) 
            Object 
            ( 
                [_fields:private] => Array 
                                    (
                                        [id]=>9094 
                                        [name]=>hussain
                                    )..
            )
)

मैं इस ऑब्जेक्ट को एक सरणी में कैसे बदल सकता हूं? मैं निम्नलिखित उत्पादन करना चाहते हैं:

Array
(
    [0]=>
    (
        [id]=>9093 
        [name]=>zahir
    ) 
    [1]=>
    (
        [id]=>9094 
        [name]=>hussain
    )...
)

क्या यह संभव है?

जवाबों:


133

आपको get_object_vars देखना चाहिए , क्योंकि आपके गुणों को निजी घोषित किया जाता है, आपको इसे कक्षा के अंदर कॉल करना चाहिए और इसके परिणाम वापस करने चाहिए।

स्ट्रिंग्स जैसे आदिम डेटा प्रकारों के लिए सावधान रहें, यह बहुत अच्छा काम करेगा, लेकिन मुझे नहीं पता कि यह नेस्टेड वस्तुओं के साथ कैसे व्यवहार करता है।

आपके मामले में आपको कुछ करना होगा;

<?php
   print_r(get_object_vars($response->response->docs));
?>

385

एकल आयामी सरणियाँ

एकल-आयाम सरणियों को परिवर्तित करने के लिए, आप उपयोग कर सकते हैं (array)या वहाँ get_object_vars, जिसका बेनोइट ने अपने उत्तर में उल्लेख किया है ।

// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);

वे एक दूसरे से थोड़ा अलग काम करते हैं। उदाहरण के लिए, get_object_varsकेवल सार्वजनिक रूप से पहुंच योग्य गुणों के साथ एक सरणी लौटाएगा जब तक कि यह उस वस्तु के दायरे से नहीं बुलाया जाता है जो आप पास कर रहे हैं (यानी ऑब्जेक्ट के सदस्य फ़ंक्शन में)। (array)दूसरी ओर, सभी सार्वजनिक, निजी और संरक्षित सदस्यों के साथ एक सरणी में डाली जाएगी, हालांकि सभी सार्वजनिक, निश्चित रूप से सरणी पर बरकरार हैं।

बहुआयामी सरणियाँ

PHP> = 5.2 के मूल JSON का उपयोग करने के लिए JSON को एन्कोड करने और फिर एक सरणी में वापस डिकोड करने के लिए कुछ हद तक गंदा तरीका है। हालांकि, इसमें निजी और संरक्षित सदस्य शामिल नहीं होंगे, और उन वस्तुओं के लिए उपयुक्त नहीं है जिनमें डेटा होता है जो JSON एन्कोडेड नहीं हो सकते (जैसे बाइनरी डेटा)।

// The second parameter of json_decode forces parsing into an associative array
$array = json_decode(json_encode($object), true);

वैकल्पिक रूप से, निम्न फ़ंक्शन किसी ऑब्जेक्ट से निजी और संरक्षित सदस्यों सहित सरणी में परिवर्तित हो जाएगा, यहाँ से लिया गया और कास्टिंग का उपयोग करने के लिए संशोधित किया गया:

function objectToArray ($object) {
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('objectToArray', (array) $object);
}

5
पहले समाधान ने उत्परिवर्तनों को संभाल नहीं किया, लेकिन दूसरे समाधान ने बहुत काम किया।
sbuck

1
2 के समाधान ने मुझे याद दिलाया कि json_decode () के लिए एक दूसरा पैरामीटर है जिसे मैं भूल गया था .. धन्यवाद।
टायलर

1
मुझे आश्चर्य है कि इस जवाब को इतने वोट क्यों मिल रहे हैं। दोनों समाधान get_object_vars की तुलना में कम स्पष्ट और सुंदर हैं
RJD22

3
@ RJD22: मैंने अपने उत्तर को 'डी फैक्टो' संसाधन से अधिक बनाने के लिए अपडेट किया है, उम्मीद है कि आप इसे अब इसके वोट के योग्य मानते हैं। ;-) हर किसी के लिए ध्यान दें कि "दूसरा समाधान" टिप्पणी यहाँ संदर्भित JSON समाधान है, जो मेरे पहले उत्तर में 2 था।
एंडी ई

बहुत बढ़िया! मैं एक समाधान से चकित था और इसे खोजने के लिए नीचे स्क्रॉल किया!
eozzy

44

आप JSON एन्कोड / डिकोड फ़ंक्शन के व्यवहार पर भरोसा करके गहरी नेस्टेड वस्तुओं को जल्दी से साहचर्य सरणियों में बदल सकते हैं:

$array = json_decode(json_encode($response->response->docs), true);

2
यह इस समस्या का सबसे सरल उत्तर है। इसका इस्तेमाल किया और इसने कमाल का काम किया। धन्यवाद
डस्टिन फ्रैकर

7
बस एक नोट - यह उस स्थिति में काम करेगा जब आपके सरणी में UTF8 वैध डेटा होगा। यदि आपके एरे में कुछ अन्य एन्कोडिंग हैं, तो Win1250 कहते हैं, यह विफल हो जाएगा, क्योंकि json_encode विफल होगा (php 5.3)
Radek

इसे वापस ऑब्जेक्ट में कैसे बदलें?
पम्प्र

@ मैट्रिक्स का उपयोग फिर से करें json_decode (json_encode ($ array), FALSE); यह भी (पुनरावर्ती) आपके सभी उप सरणियों को वस्तुओं में परिवर्तित करता है,
Mufaddal

काश मैं इसे एक से अधिक बार उखाड़ सकता।
जॉन्सएफ

34

सावधान:

$array = (array) $object;

एक उथला रूपांतरण ($ ऑब्जेक्ट-> इनरऑबजेक्ट = नया stdClass () एक ऑब्जेक्ट रहता है) और json कार्यों का उपयोग करके आगे और पीछे परिवर्तित होता है, लेकिन यह एक अच्छा विचार नहीं है यदि प्रदर्शन एक मुद्दा है।

यदि आपको सभी वस्तुओं को सहयोगी सरणियों में परिवर्तित करने की आवश्यकता है, तो ऐसा करने का एक बेहतर तरीका है (कोड से फट गया जहां मुझे याद नहीं है कि:)

function toArray($obj)
{
    if (is_object($obj)) $obj = (array)$obj;
    if (is_array($obj)) {
        $new = array();
        foreach ($obj as $key => $val) {
            $new[$key] = toArray($val);
        }
    } else {
        $new = $obj;
    }

    return $new;
}

मैं ऑब्जेक्ट कास्टिंग के कारण सरणी नहीं पढ़ सकता: codepad.viper-7.com/AkX5pq क्या आपके पास इसके बारे में कोई स्पष्टीकरण है?
डेमियन

1
मुझे यह उत्तर सबसे अच्छा लगा। एंडी ई का पुनरावर्ती कार्य अनिवार्य रूप से एक ही काम करता है, लेकिन मुझे यह समझने में आसान लगता है।
हार्टलेशन

20
$array = json_decode(json_encode($object), true);

मैंने foreachएक वस्तु के साथ करने के कई तरीके आजमाए और यह वास्तव में सबसे आसान और अच्छा तरीका है जिसे मैंने देखा है। बस एक लाइन :)


यह केवल सार्वजनिक ऑब्जेक्ट विशेषताओं के साथ सही काम करता है। निजी नहीं मानते।
लिमोन

यहाँ JsonSerialize फ़ंक्शन का उपयोग करने के बारे में कुछ स्पष्टीकरण दिए गए हैं, लेकिन एक लाइन समाधान नहीं है और मैंने पढ़ा है कि यह एक अच्छा अभ्यास नहीं है :( stackoverflow.com/questions/7005860/… । सलाह के लिए धन्यवाद।
m3nder

इसे वापस ऑब्जेक्ट में कैसे बदलें?
पम्प्र

18

सरल संस्करण:

$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();

अपडेट किया गया पुनरावर्ती संस्करण:

class RecursiveArrayObject extends ArrayObject
{
    function getArrayCopy()
    {
        $resultArray = parent::getArrayCopy();
        foreach($resultArray as $key => $val) {
            if (!is_object($val)) {
                continue;
            }
            $o = new RecursiveArrayObject($val);
            $resultArray[$key] = $o->getArrayCopy();
        }
        return $resultArray;
    }
}

$arrayObject = new RecursiveArrayObject($object);
$array = $arrayObject->getArrayCopy();

2

इसे इस्तेमाल करे:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>

2

मुझे भी यही समस्या थी और मैंने इसे get_object_vars से हल किया ऊपर उल्लिखित किया।

इसके अलावा, मुझे अपनी वस्तु को json_decode के साथ परिवर्तित करना पड़ा और मुझे "लूप (बल्कि फिर प्रत्येक के लिए) के लिए oldschool" के साथ सरणी को पुनरावृत्त करना पड़ा।


0

आप php की array_values ​​() विधि का भी उपयोग कर सकते हैं


2
आप नहीं कर सकते। "Array_values ​​() पैरामीटर 1 को सरणी, ऑब्जेक्ट दिए जाने की उम्मीद करता है"।
मैनटवर्क

0

मैं एंडी इयरनशॉ के उत्तर के साथ एक मुद्दे पर भाग गया क्योंकि मैंने इस फ़ंक्शन को अपने आवेदन "हेल्परफंक्शंस" के भीतर एक अलग वर्ग को दे दिया था, जिसका अर्थ था कि ऑब्जेक्टट्रोएरे () में पुनरावर्ती कॉल विफल हो गया।

मैं इस तरह से array_map कॉल के भीतर वर्ग का नाम निर्दिष्ट करके इस पर काबू पा लिया:

public function objectToArray($object) {
    if (!is_object($object) && !is_array($object))
        return $object;
    return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}

मैंने इसे टिप्पणियों में लिखा होगा, लेकिन अभी मेरी पर्याप्त प्रतिष्ठा नहीं है।


-2
//My Function is worked. Hope help full for you :)
      $input = [
            '1' => (object) [1,2,3],
            '2' => (object) [4,5,6,
                (object) [6,7,8,
                [9, 10, 11,
                    (object) [12, 13, 14]]]
            ],
            '3' =>[15, 16, (object)[17, 18]]
        ];

        echo "<pre>";
        var_dump($input);
        var_dump(toAnArray($input));

      public function toAnArray(&$input) {

        if (is_object($input)) {
            $input = get_object_vars($input);
        }
        foreach ($input as &$item) {
            if (is_object($item) || is_array($item)) {
                if (is_object($item)) {
                    $item = get_object_vars($item);
                }
                self::toAnArray($item);
            }
        }
    }

आपका फ़ंक्शन कुछ भी वापस नहीं करता है। वहाँ कोई रास्ता नहीं यह काम करता है!
रोटिमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.