php stdClass to array


195

मुझे एक वस्तु stdClass को सरणी में बदलने के लिए एक समस्या है। मैंने इस तरह से कोशिश की है:

return (array) $booking;

या

return (array) json_decode($booking,true);

या

return (array) json_decode($booking);

कलाकारों से पहले की सरणी एक रिकॉर्ड से भरी हुई है, मेरे द्वारा डाली जाने की कोशिश के बाद यह खाली है। अपनी पंक्तियों को हटाने के बिना इसे कैसे डालें / परिवर्तित करें?

डाली से पहले सरणी:

array(1) {   [0]=>   object(stdClass)#23 (36) {     ["id"]=>     string(1) "2"     ["name"]=>     string(0) ""     ["code"]=>     string(5) "56/13"   } } 

अगर मैं बनाने की कोशिश करता हूं तो कास्ट खाली है var_dump($booking);

मैंने भी इस समारोह की कोशिश की है, लेकिन हमेशा खाली है:

public function objectToArray($d) {
        if (is_object($d)) {
            // Gets the properties of the given object
            // with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            // Return array
            return $d;
        }
    }

php.net/var_dump ... php.net/var_export - पहले return। और json_decodeएक सरणी पर दौड़ना मुझे बहुत हताश करता है, शायद कंप्यूटर के सामने बहुत देर तक बैठा रहता है और अब ब्रेक लेने का समय आ गया है?
हेक्रे

बस स्पष्ट करने के लिए: var_dump($booking);आउटपुट NULL?
हकर्रे

के बाद हाँ, और अगर मैं इसे मुद्रित करने की कोशिश: $ बुकिंग [0] ['आईडी'] मुझे वापस कि अस्तित्व में नहीं है
Alessandro Minoccheri

आपको पढ़ने में रुचि हो सकती है: PHP में उपयोगी त्रुटि संदेश कैसे प्राप्त करें? - वैसे भी, मैं कास्टिंग से var_dump() पहले पूछ रहा था । उसी चर नाम btw का फिर से उपयोग न करें। यदि $bookingकास्टिंग से पहले कुछ था, तो यह अभी भी होना चाहिए कि कास्टिंग से पहले कुछ और बाद में कुछ अलग न हो। इनपुट और प्रोसेसिंग वैरिएबल के बीच अंतर अन्यथा आप उन समस्याओं में भाग लेते हैं जिन्हें आप अब तक नहीं समझते कि आप वहां क्या करते हैं।
हकर्रे

प्रश्न को छोटा करना (जैसे कस्टम फ़ंक्शन कोड को निकालना) नीचे स्क्रॉल किए बिना स्वीकृत उत्तर को देखने के लिए उपयोगी हो सकता है
cnlevy

जवाबों:


432

आलसी एक लाइनर विधि

आप इसे JSON विधियों का उपयोग करके एक लाइनर में कर सकते हैं यदि आप प्रदर्शन का एक छोटा सा हिस्सा खोने के लिए तैयार हैं (हालांकि कुछ ने रिपोर्ट किया है कि यह वस्तुओं के माध्यम से पुनरावृत्ति की तुलना में तेज़ होने की संभावना है - सबसे अधिक संभावना है क्योंकि PHP कॉलिंग फ़ंक्शन पर धीमा है )। " लेकिन मैंने पहले से ही ऐसा किया था " आप कहते हैं। बिल्कुल नहीं - आपने json_decodeसरणी पर उपयोग किया है , लेकिन आपको इसे json_encodeपहले से एन्कोड करने की आवश्यकता है ।

आवश्यकताएँ

json_encodeऔर json_decodeतरीकों। ये स्वचालित रूप से PHP 5.2.0 और ऊपर में बंडल किए गए हैं। यदि आप किसी पुराने संस्करण का उपयोग करते हैं, तो एक PECL लाइब्रेरी भी है (उस स्थिति में, आपको वास्तव में अपने PHP इंस्टॉलेशन को अपडेट करना चाहिए । 2006 में 5.1 के लिए समर्थन बंद कर दिया गया था।)


एक array/ stdClass-> परिवर्तित करनाstdClass

$stdClass = json_decode(json_encode($booking));

एक array/ stdClass-> परिवर्तित करनाarray

मैनुअल निम्नलिखित के दूसरे तर्क को निर्दिष्ट json_decodeकरता है:

Assoc
जब TRUE, लौटे वस्तुओं साहचर्य सरणियों में बदल दिया जाएगा।

इसलिए निम्न पंक्ति आपकी संपूर्ण वस्तु को एक सरणी में बदल देगी:

$array = json_decode(json_encode($booking), true);

1
यदि (array) $booking;एक में var_dumpहै NULL(जैसा कि ओपी द्वारा लिखा गया है), अनुमान करें कि यह कोड क्या लौटेगा?
हेकरे

@hakre ऐसा लगता नहीं है कि यह NULLएक सरणी के रूप में कास्टिंग के बाद है। मुझे लगता है कि ओपी का मतलब है कि यह NULLउपयोग करने के बाद है json_decode($array)जो मैनुअल के अनुसार समझ में आता है । NULL को लौटा दिया जाता है यदि json डिकोड नहीं किया जा सकता है
h2ooooooo

4
@AlessandroMinoccheri जब आप json_decode()किसी सरणी पर उपयोग कर रहे थे, तो इससे पहले यह काम नहीं करता था । json_decodeJSON स्ट्रिंग पर उपयोग किया जाना चाहिए। इसलिए, यदि हम इसे पहले JSON स्ट्रिंग ( json_encode) के रूप में एन्कोड करते हैं और फिर इसे (हमारे JSON स्ट्रिंग का उपयोग करके ) डीकोड करते हैं, तो यह ठीक काम करता है।
h2ooooooo

3
क्या हर कोई यह भूल गया है कि आप अपने प्रकार खो देंगे जो JSON कल्पना (उदाहरण के लिए दिनांक) में परिभाषित नहीं हैं? यदि आप इस दृष्टिकोण का उपयोग करते हैं तो आपको एक रिवीवर की आवश्यकता होगी। यह केवल तभी अच्छा है जब आपके पास बुनियादी प्रकार जैसे संख्याएं, तार और बूलियन हों।
डेनिस पशेनोव

1
शानदार जवाब, मैं सिर्फ json_decode ($ stdClass, true);) का उपयोग कर रहा हूँ
didando8a

68

आप जिस प्रकार के हैं उसके बाद एक मानक सरणी वापस पाने के लिए इस फ़ंक्शन का उपयोग करें ...

return get_object_vars($booking);

19
यह पुनरावर्ती नहीं है
gawpertron

17

चूंकि आप इसे डालने से पहले यह एक सरणी है, इसलिए इसे डालना कोई मतलब नहीं है।

आप एक पुनरावर्ती कलाकार चाहते हैं, जो कुछ इस तरह दिखाई देगा:

function arrayCastRecursive($array)
{
    if (is_array($array)) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $array[$key] = arrayCastRecursive($value);
            }
            if ($value instanceof stdClass) {
                $array[$key] = arrayCastRecursive((array)$value);
            }
        }
    }
    if ($array instanceof stdClass) {
        return arrayCastRecursive((array)$array);
    }
    return $array;
}

उपयोग:

$obj = new stdClass;
$obj->aaa = 'asdf';
$obj->bbb = 'adsf43';
$arr = array('asdf', array($obj, 3));

var_dump($arr);
$arr = arrayCastRecursive($arr);
var_dump($arr);

परिणाम से पहले:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        object(stdClass)[1]
          public 'aaa' => string 'asdf' (length = 4)
          public 'bbb' => string 'adsf43' (length = 6)
      1 => int 3

परिणाम के बाद:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        array
          'aaa' => string 'asdf' (length = 4)
          'bbb' => string 'adsf43' (length = 6)
      1 => int 3

ध्यान दें:

परीक्षण और जटिल सरणियों के साथ काम करना जहां एक stdClass ऑब्जेक्ट में अन्य stdClass ऑब्जेक्ट हो सकते हैं।


महान। अब stdClass ऑब्जेक्ट्स के लिए काम करता है जिसमें stdClass ऑब्जेक्ट्स :)
Vlad Preda

14

Php stdClass को array में बदलने के लिए कृपया php फंक्शन को फॉलो करें

get_object_vars($data)

2
ध्यान दें कि यह फ़ंक्शन पुनरावर्ती नहीं है। एक पुनरावर्ती समाधान के लिए कार्लो फॉन्टानोस द्वारा जवाब देखें ।
कोर्टनी माइल्स


12

टाइप कास्ट कार्यक्षमता में निर्मित का उपयोग करें, बस टाइप करें

$realArray = (array)$stdClass;

1
मैं इस पर पसंद करता हूँ json_decode / सांकेतिक शब्दों में बदलना, बहुत क्लीनर +1
लोगान

2
यह विधि क्लीनर है, हालांकि, यह पुनरावर्ती भी नहीं है, और get_object_vars () के समान काम करता है। जबकि json_decode / encode पद्धति में हैक की अनुभूति होती है, यह पुनरावर्ती रूप से काम करता है।
डेबी वी

3

बस इसे googled, और यहाँ पाया कि एक आसान कार्य है जो stdClass ऑब्जेक्ट को पुनरावर्ती रूप से सरणी में परिवर्तित करने के लिए उपयोगी है।

<?php
function object_to_array($object) {
 if (is_object($object)) {
  return array_map(__FUNCTION__, get_object_vars($object));
 } else if (is_array($object)) {
  return array_map(__FUNCTION__, $object);
 } else {
  return $object;
 }
}
?>

संपादित करें : मैंने इस उत्तर को लिंक किए गए स्रोत से सामग्री के साथ अपडेट किया (जो अब भी बदल गया है), मुझे सुझाव देने के लिए mason81 के लिए धन्यवाद।


1
अगली बार कृपया संबंधित स्रोत से संबंधित सामग्री शामिल करें। आपके द्वारा प्रदान किया गया लिंक बदल गया है और अब अप्रासंगिक और बेकार है।
mason81

यह वही है जिसकी मुझे तलाश थी, बहुत बहुत धन्यवाद।

0

यहाँ कार्लो के उत्तर का एक संस्करण दिया गया है जिसका उपयोग कक्षा में किया जा सकता है:

class Formatter
{
    public function objectToArray($data)
    {
        if (is_object($data)) {
            $data = get_object_vars($data);
        }

        if (is_array($data)) {
            return array_map(array($this, 'objectToArray'), $data);
        }

        return $data;
    }
}

0

निम्नलिखित कोड सभी ईमेल पढ़ेंगे और विषय, बॉडी और दिनांक प्रिंट करेंगे।

<?php
  $imap=imap_open("Mailbox","Email Address","Password");
  if($imap){$fixMessages=1+imap_num_msg($imap);  //Check no.of.msgs
/*
By adding 1 to "imap_num_msg($imap)" & starting at $count=1
   the "Start" & "End" non-messages are ignored
*/
    for ($count=1; $count<$fixMessages; $count++){
      $objectOverview=imap_fetch_overview($imap,$count,0);
print '<br>$objectOverview: '; print_r($objectOverview);
print '<br>objectSubject ='.($objectOverview[0]->subject));
print '<br>objectDate ='.($objectOverview[0]->date);
      $bodyMessage=imap_fetchbody($imap,$count,1);
print '<br>bodyMessage ='.$bodyMessage.'<br><br>';
    }  //for ($count=1; $count<$fixMessages; $count++)
  }  //if($imap)
  imap_close($imap);
?>

यह निम्न आउटपुट देता है:

$objectOverview: Array ( [0] => stdClass Object ( [subject] => Hello
[from] => Email Address [to] => Email Address [date] => Sun, 16 Jul 2017 20:23:18 +0100
[message_id] =>  [size] => 741 [uid] => 2 [msgno] => 2 [recent] => 0 [flagged] => 0 
[answered] => 0 [deleted] => 0 [seen] => 1 [draft] => 0 [udate] => 1500232998 ) )
objectSubject =Hello
objectDate =Sun, 16 Jul 2017 20:23:18 +0100
bodyMessage =Test 

विभिन्न सुझावों से जूझने के बाद मैंने इस समाधान के साथ आने के लिए परीक्षण और त्रुटि का उपयोग किया है। आशा करता हूँ की ये काम करेगा।


0

यहाँ मेरे पास सबसे अच्छा ऑब्जेक्ट है Array function - recursively काम करता है:

function object_to_array($obj, &$arr){

    if(!is_object($obj) && !is_array($obj)){
        $arr = $obj;
        return $arr;
    }

    foreach ($obj as $key => $value)
    {
        if (!empty($value))
        {
            $arr[$key] = array();
            object_to_array_v2($value, $arr[$key]);
        }
        else
        {
            $arr[$key] = $value;
        }
    }
    return $arr;
}

$ clean_array = object_to_array ($ object_data_here);

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