আমি কীভাবে একটি বস্তুকে অ্যারে রূপান্তর করব?


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)অন্যদিকে, সমস্ত সরকারী, ব্যক্তিগত এবং সুরক্ষিত সদস্যদের সাথে অ্যারেতে অক্ষত থাকবে, এখন অবশ্যই সমস্ত পাবলিক, অবশ্যই।

বহুমাত্রিক অ্যারে

কিছুটা নোংরা পদ্ধতি হল পিএইচপি> = 5.2 এর স্থানীয় জেএসএন ফাংশনগুলি জেএসএনকে এনকোড করতে এবং তারপরে একটি অ্যারেতে ডিকোড করা। তবে এটিতে ব্যক্তিগত এবং সুরক্ষিত সদস্যদের অন্তর্ভুক্ত করা হবে না এবং এটি এমন বস্তুর জন্য উপযুক্ত নয় যা এমন ডেটা রয়েছে যাতে জেএসওএন এনকোড করা যায় না (যেমন বাইনারি ডেটা)।

// 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
২ য় সমাধান আমাকে মনে করিয়ে দিল যে জসন_ডেকোড () -এর একটি দ্বিতীয় প্যারামিটার রয়েছে যা আমি ভুলে গিয়েছি .. ধন্যবাদ।
টাইলার

1
আমি ভাবছি কেন এই উত্তর এত বেশি ভোট পাচ্ছে? উভয় সমাধানই get_object_vars এর চেয়ে কম স্পষ্ট এবং সুন্দর
আরজেডি 22

3
@ আরজেডি 22: আমি এটিকে 'ডি ফ্যাক্টো' রিসোর্সটিকে আরও বেশি করে তৈরি করার জন্য আমার উত্তর আপডেট করেছি, আশা করি আপনি এখন এটির ভোটের যোগ্য হিসাবে বিবেচিত হবেন। ;-) প্রত্যেককে লক্ষ্য করুন যে মন্তব্যগুলিকে এখানে উল্লেখ করা "দ্বিতীয় সমাধান" হ'ল জেএসওএন সমাধান, যা আমার প্রথম উত্তরের ২ য় ছিল was
অ্যান্ডি ই

অসাধারণ! আমি একটি সমাধান দ্বারা বিস্মিত এবং এটি খুঁজে নিচে স্ক্রোল!
ইওজি

44

আপনি JSON এনকোড / ডিকোড ফাংশনগুলির আচরণের উপর নির্ভর করে দ্রুত গভীরভাবে বাসাযুক্ত জিনিসগুলিকে সহযোগী অ্যারে রূপান্তর করতে পারেন:

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

2
এটি এই সমস্যার সর্বাধিক সহজ উত্তর। এটি ব্যবহৃত হয়েছে এবং এটি দুর্দান্ত কাজ করেছে। ধন্যবাদ
ডাস্টিন ফ্রেকার

7
কেবলমাত্র একটি নোট - আপনার অ্যারেতে ইউটিএফ 8 বৈধ ডেটা রয়েছে এমন ক্ষেত্রে এটি কাজ করবে। যদি আপনার অ্যারেতে অন্য কোনও এনকোডিং রয়েছে, তবে উইন 1250 বলুন, এটি ব্যর্থ হবে, যেহেতু জসন_এনকোড ব্যর্থ হবে (পিএইচপি 5.3)
রাদেক

কীভাবে এটিকে আবার কোনও বস্তুতে রূপান্তর করা যায়?
পিএমপিআর

@ ট্রিক্স আবার জসনকে json_decode (json_encode ($ অ্যারে), FALSE) ব্যবহার করুন; এটিও (পুনরাবৃত্তভাবে) আপনার সমস্ত সাব অ্যারেগুলিকে বস্তুতে রূপান্তরিত করে
মুফাদডাল

আমি আশা করি আমি এটি একাধিকবার তুলতে পারি could
জনএফএফ

34

সতর্ক থাকুন:

$array = (array) $object;

একটি অগভীর রূপান্তর ($ অবজেক্ট-> ইনটারঅবজেক্ট = নতুন স্টাডক্লাস () একটি অবজেক্ট হিসাবে রয়ে গেছে) এবং জেসন কাজ করে পিছনে পিছনে রূপান্তর করে তবে পারফরম্যান্স যদি কোনও সমস্যা হয় তবে এটি ভাল ধারণা নয়।

আপনার যদি সমস্ত অবজেক্টটি এসোসিয়েটিভ অ্যারেগুলিতে রূপান্তরিত করতে হয় তবে এটি করার একটি আরও ভাল উপায় (কোডটি ছিঁড়ে গেছে যেখানে আমি মনে করি না):

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/AXX5pq আপনার কি সে সম্পর্কে কোনও ব্যাখ্যা আছে?
ড্যামিয়েন

1
আমার এই উত্তরটি সবচেয়ে ভাল লেগেছে। অ্যান্ডি ই এর পুনরাবৃত্তির কাজটি মূলত একই জিনিসটি করে তবে আমি এটি বুঝতে সহজ মনে করি।
হার্টলেসান

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

আমি foreachকোনও অবজেক্টের সাথে কিছু করার চেষ্টা করেছি এবং এটি আমার মধ্যে দেখা সবচেয়ে সহজ এবং শান্ত কাজ। মাত্র একটি লাইন :)


এটি শুধুমাত্র পাবলিক অবজেক্ট বৈশিষ্ট্যগুলির সাথে নিখুঁত কাজ করে। ব্যক্তিগতকে বিবেচনা করে না।
লিমন

এখানে ব্যবহার JsonSerialize ফাংশন কিছু ব্যাখ্যা আছে, কিন্তু এক লাইন সমাধান নয় এবং আমি পড়া সম্পর্কে একটি ভাল অভ্যাস :( নয় stackoverflow.com/questions/7005860/... পরামর্শের জন্য আপনাকে
m3nda

কীভাবে এটিকে আবার কোনও বস্তুতে রূপান্তর করা যায়?
পিএমপিআর

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

আমার একই সমস্যা ছিল এবং আমি এটি উপরে উল্লিখিত get_object_vars দিয়ে সমাধান করেছি ।

তদুপরি, আমাকে আমার বস্তুটি json_decode এর সাথে রূপান্তর করতে হয়েছিল এবং আমাকে ওল্ডস্কুলের সাথে অ্যারেটি পুনরায় পাঠাতে হয়েছিল "" লুপের জন্য (বরং তারপরে প্রত্যেকটির জন্য)।


0

আপনি পিএইচপি করার অ্যারে_ভ্যালু () পদ্ধতিটিও ব্যবহার করতে পারেন


2
আপনি পারবেন না। "অ্যারে_ভ্যালুগুলি () প্রত্যাশা 1 প্যারামিটারটি অ্যারে হবে, বস্তুটি দেওয়া হবে"।
manatwork

0

আমি অ্যান্ডি আর্নশয়ের জবাব নিয়ে একটি ইস্যুতে ছড়িয়ে পড়েছি কারণ আমি এই অ্যাপ্লিকেশনটির মধ্যে একটি পৃথক শ্রেণীর কাছে এই ফাংশনটি তৈরি করেছিলাম "হেল্পারফিউশনস", যার অর্থ অবজেক্টটোয়ারে পুনরাবৃত্তি কল ব্যর্থ হয়েছিল ()।

অ্যারে_ম্যাপ কল এর মধ্যে শ্রেণীর নাম উল্লেখ করে আমি এটিকে পরাভূত করেছি:

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

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