অ্যারে থেকে পিএইচপি stdClass


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একটি অ্যারেতে চালানো আমার কাছে বেশ মরিয়া মনে হচ্ছে, সম্ভবত কম্পিউটারের সামনে খুব দীর্ঘ সময় বসে আছে এবং এখনই একটু বিরতি নেওয়ার সময় এসেছে?
hakre

শুধু নির্মল: var_dump($booking);আউটপুট NULL?
hakre

হ্যাঁ
বলার

আপনি পড়তে আগ্রহী হতে পারেন: পিএইচপি-তে কীভাবে দরকারী ত্রুটি বার্তা পাবেন? - যাইহোক, আমি কাস্টিংয়ের var_dump() আগে জিজ্ঞাসা করছিলাম । একই পরিবর্তনশীল নামটি বিটিডব্লু আবার ব্যবহার করবেন না। $bookingকাস্টিংয়ের আগে যদি কিছু ছিল তবে এখনও কাস্টিংয়ের আগে এমন কিছু হওয়া উচিত এবং এরপরে আলাদা কিছু নয়। ইনপুট এবং প্রসেসিং ভেরিয়েবলের মধ্যে পার্থক্য করুন অন্যথায় আপনি এমন সমস্যায় পড়ে যাচ্ছেন যা আপনি সেখানে কী করছেন তা আর বুঝতে পারছেন না।
hakre

প্রশ্নটি ছোট করা (কাস্টম ফাংশন কোডটি সরিয়ে দেওয়ার মতো) নীচে স্ক্রোল না করে গ্রহণযোগ্য উত্তরটি দেখতে দরকারী হতে পারে
cnlevy

উত্তর:


430

অলস এক-লাইনের পদ্ধতি

আপনি যদি JSON পদ্ধতি ব্যবহার করে এক লাইনারে এটি করতে পারেন তবে আপনি যদি সামান্য পারফরম্যান্স হারাতে ইচ্ছুক হন (যদিও কেউ কেউ এটি পুনরাবৃত্তভাবে অবজেক্টগুলির মাধ্যমে পুনরাবৃত্ত হওয়ার চেয়ে দ্রুততর বলে জানিয়েছেন - সম্ভবত পিএইচপি কলিং ফাংশনগুলিতে ধীর গতির )। " তবে আমি ইতিমধ্যে এটি করেছি " আপনি বলে। হুবহু নয় - আপনি json_decodeঅ্যারে ব্যবহার করেছেন, তবে আপনাকে json_encodeপ্রথমে এটি এনকোড করা দরকার ।

আবশ্যকতা

json_encodeএবং json_decodeপদ্ধতি। এগুলি পিএইচপি 5.2.0 এবং তারপরে স্বয়ংক্রিয়ভাবে বান্ডিল হয়ে গেছে। আপনি যদি কোনও পুরানো সংস্করণ ব্যবহার করেন তবে একটি পিইসিএল লাইব্রেরিও রয়েছে (যা বলেছিল যে সেক্ষেত্রে আপনার সত্যই আপনার পিএইচপি ইনস্টলেশন আপডেট করা উচিত 5


একটি array/ stdClass-> রূপান্তর করাstdClass

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

একটি array/ stdClass-> রূপান্তর করাarray

ম্যানুয়ালটি দ্বিতীয় যুক্তিটি নির্দিষ্ট করে json_decode:

এসোসিয়েশন
যখন TRUE, প্রত্যাবর্তিত বস্তুগুলি মিশুক অ্যারে রূপান্তরিত হবে।

সুতরাং নিম্নলিখিত লাইনটি আপনার সম্পূর্ণ বস্তুকে একটি অ্যারে রূপান্তর করবে:

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

1
যদি (array) $booking;কোনও var_dumpহয় NULL(ওপি দ্বারা লিখিত হিসাবে), অনুমান করুন যে এই কোডটি ফিরে আসবে?
hakre

@hakre এটি NULLঅ্যারে হিসাবে কাস্ট করার পরে দেখে মনে হচ্ছে না । আমি মনে করি ওপি এর মানে হল এটি NULLব্যবহারের পরে json_decode($array)যা ম্যানুয়াল অনুসারে অর্থ দেয় ।
জাসনকে

4
@ অ্যালেসান্দ্রোমিনোশেরি আপনি json_decode()অ্যারে ব্যবহারের আগে এটি আগে কাজ না করার কারণ ছিল । json_decodeএকটি JSON স্ট্রিং ব্যবহার করা উচিত। অতএব, আমরা যদি প্রথমে এটি JSON স্ট্রিং হিসাবে এনকোড করি ( json_encode) এবং তারপরে এটি ডিকোড করি (আমাদের JSON স্ট্রিং ব্যবহার করে), তবে এটি দুর্দান্ত কাজ করে works
h2ooooooo

3
সবাই কি ভুলে গেছে যে আপনি আপনার প্রকারগুলি হারাবেন যা জেএসএন স্পেসে সংজ্ঞায়িত হয়নি (উদাহরণস্বরূপ তারিখগুলি)? আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে আপনার একটি রিভিভার দরকার। এটি কেবল তখনই ভাল তবে আপনার যদি সংখ্যা, স্ট্রিং এবং বুলিয়ানগুলির মতো প্রাথমিক ধরণ থাকে।
ডেনিস সেশেনভ

1
দুর্দান্ত উত্তর, আমি কেবল json_decode ব্যবহার করেছি (d stdClass, সত্য);)
didando8a

68

আপনি যে ধরণের পরে আছেন তার কোনও মানক অ্যারে ফিরে পেতে এই ফাংশনটি ব্যবহার করুন ...

return get_object_vars($booking);

19
এটি পুনরাবৃত্তিযোগ্য নয়
গ্যাপার্পট্রন

17

যেহেতু এটি কাস্ট করার আগে এটি একটি অ্যারে, তাই এটি ingালাই কোনও লাভ হয় না।

আপনি একটি পুনরাবৃত্ত castালাই চান, যা দেখতে কিছু হবে:

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 অবজেক্টের জন্য কাজ করে :)
Vlad Preda

14

পিএইচপি stdClass অ্যারে রূপান্তর করতে দয়া করে নিম্নলিখিত পিএইচপি ফাংশন ব্যবহার করুন

get_object_vars($data)

2
মনে রাখবেন যে এই ফাংশনটি পুনরাবৃত্ত হয় না। পুনরাবৃত্ত সমাধানের জন্য কার্লো ফন্টানোসের উত্তরটি দেখুন ।
কোর্টনি মাইলস


12

বিল্ট ইন টাইপ কাস্ট কার্যকারিতা ব্যবহার করুন, কেবল টাইপ করুন

$realArray = (array)$stdClass;

1
আমি এটিকে json_decode / এনকোডের চেয়ে বেশি পছন্দ করি, অনেক ক্লিনার +1
লোগান

1
এই পদ্ধতিটি পরিষ্কার, তবে এটি পুনরাবৃত্ত হয় না এবং get_object_vars () এর মতোই কাজ করে। যখন json_decode / এনকোড পদ্ধতিতে একটি হ্যাক অনুভূতি রয়েছে, এটি পুনরাবৃত্তভাবে কাজ করে।
ডেবি ভি

3

কেবল এটি গুগল করে, এবং এখানে একটি হ্যান্ডি ফাংশন পাওয়া গেছে যা 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

আমার কাছে অ্যারে ফাংশনের সেরা অবজেক্টটি এখানে রয়েছে - পুনরাবৃত্তভাবে কাজ করে:

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;
}

$ ক্লিন_আরে = অবজেক্ট_ টু_রে ($ অবজেক্ট_ডাটা_এখানে);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.