পূর্ণসংখ্যার মতো নামের সাথে কীভাবে অবজেক্টের বৈশিষ্ট্য অ্যাক্সেস করবেন?


87

আমি এরকম json_decode()কিছু ব্যবহার করছি :

$myVar = json_decode($data)

যা আমাকে এভাবে আউটপুট দেয়:

[highlighting] => stdClass Object
        (
            [448364] => stdClass Object
                (
                    [Data] => Array
                        (
                            [0] => Tax amount liability is ....... 

আমি কী [0] এ স্ট্রিংয়ের মানটি অ্যাক্সেস করতে চাই। যখন আমি কিছু করার চেষ্টা করি:

print $myVar->highlighting->448364->Data->0;

আমি এই ত্রুটি পেয়েছি:

পার্স ত্রুটি: সিনট্যাক্স ত্রুটি, অপ্রত্যাশিত T_DNUMBER

দুটি সংখ্যা / পূর্ণসংখ্যার সমস্যা বলে মনে হচ্ছে।



4
@ ফেলিক্সকলিং: আমি সিভিও করেছি, তবে বাস্তবে দেখা যাচ্ছে এটি কোনও ডুপ নয়: সম্পত্তির নামটি যদি কোনও সংখ্যার সাথে শুরু হয় বা সমস্ত সংখ্যার হয় তবে এটি কোনও পার্থক্য করে !
জন

@ জন: এমএমএমএইচ, আকর্ষণীয় ... আমার অনুমান করার আগে একটি পরীক্ষা করা উচিত ছিল। আমাকে জানতে দেওয়ার জন্য ধন্যবাদ!
ফেলিক্স ক্লিং

উত্তর:


288

পিএইচপি 7.2 এর জন্য আপডেট হয়েছে

পিএইচপি .2.২ বস্তু এবং অ্যারে কাস্টগুলিতে সংখ্যার কীগুলিতে রূপান্তর করার জন্য একটি আচরণগত পরিবর্তন প্রবর্তন করেছিল , যা এই নির্দিষ্ট অসঙ্গতিটি সংশোধন করে এবং নিম্নলিখিত সমস্ত উদাহরণকে প্রত্যাশার সাথে আচরণ করে।

আরও একটি বিষয় সম্পর্কে বিভ্রান্ত হতে হবে!


আসল উত্তর (7.2.0 এর আগের সংস্করণগুলিতে প্রযোজ্য)

পিএইচপি-র অন্ধকার এলির অংশ রয়েছে যা আপনি সত্যই নিজেকে ভিতরে খুঁজে পেতে চান না। নামগুলির সাথে সম্বোধনযুক্ত বৈশিষ্ট্যগুলি এর মধ্যে একটি ...

যা তারা আপনাকে কখনও বলেনি

ঘটনা # 1: আপনি সহজেই আইনী পরিবর্তনশীল নাম নয় এমন নামগুলির সাথে সম্পত্তিগুলিতে অ্যাক্সেস করতে পারবেন না

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo; // error

ঘটনা # 2: আপনি কোঁকড়ানো ব্রেস সিনট্যাক্স সহ এই জাতীয় বৈশিষ্ট্য অ্যাক্সেস করতে পারেন

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!

ফ্যাক্ট # 3: কিন্তু না যদি সম্পত্তি নাম ভাবে সংখ্যা বসিয়ে হয়!

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
echo $o->{'123'}; // error!

সরাসরি উদাহরণ

ঘটনা # 4: আচ্ছা, যদি না বস্তুটি প্রথম স্থানটিতে অ্যারে থেকে না আসে।

$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123'; // setting property is OK

echo $o1->{'123'}; // error!
echo $o2->{'123'}; // works... WTF?

সরাসরি উদাহরণ

খুব স্বজ্ঞাত, আপনি একমত না?

তুমি কি করতে পার

বিকল্প # 1: এটি ম্যানুয়ালি করুন

সর্বাধিক ব্যবহারিক পদ্ধতিটি হ'ল আপনার আগ্রহী অবজেক্টটিকে কোনও অ্যারেতে ফিরিয়ে দেওয়া, যা আপনাকে বৈশিষ্ট্যগুলি অ্যাক্সেস করার অনুমতি দেবে:

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'}; // error!
echo $a['123']; // OK!

দুর্ভাগ্যক্রমে, এটি পুনরাবৃত্তির সাথে কাজ করে না। সুতরাং আপনার ক্ষেত্রে আপনার মতো কিছু করা দরকার:

$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0']; // at last!

বিকল্প # 2: পারমাণবিক বিকল্প

বিকল্প পদ্ধতি হ'ল একটি ফাংশন লিখুন যা বস্তুগুলিকে পুনরাবৃত্তিতে অ্যারেতে রূপান্তর করে:

function recursive_cast_to_array($o) {
    $a = (array)$o;
    foreach ($a as &$value) {
        if (is_object($value)) {
            $value = recursive_cast_to_array($value);
        }
    }

    return $a;
}

$arr = recursive_cast_to_array($myVar);
$value = $arr['highlighting']['448364']['Data']['0'];

তবে, আমি নিশ্চিত নই যে বোর্ড জুড়ে এটি একটি আরও ভাল বিকল্প কারণ এটি অনাবশ্যকভাবে যে সমস্ত সম্পত্তি আপনার আগ্রহী নয় ততগুলি আপনার নিজেরাই আগ্রহী নয় এমন সমস্ত ধরণের অ্যারে চালিয়ে যাবে ।

বিকল্প # 3: এটি চালাক খেলছে

পূর্ববর্তী বিকল্পের একটি বিকল্প হ'ল অন্তর্নির্মিত জেএসওএন কার্যাদি ব্যবহার করা:

$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];

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


আমার সমস্যা সমাধানের ক্ষেত্রেও তা ঘটেছিল! stackoverflow.com/questions/4643894/...
Bossliaw

জোন, আমাকে বাঁচানোর জন্য ধন্যবাদ। যদিও আমার সমস্যাটি অন্যরকম ছিল (আমার ধারণা এটি সত্যই "তারা আপনাকে কখনই বলেনি" অংশে)। ডিবি থেকে পুনরুদ্ধার করা ডেটটাইম অবজেক্টটি ঠিক আছে মনে হয় তবে আমি যদি এর কোনও বৈশিষ্ট্যে অ্যাক্সেস করি তবে যেমন ->dateবা ->timezoneকেবলমাত্র nullফিরে আসে। আমি লক্ষ্য করেছি যে আমি এই বৈশিষ্ট্যগুলি ব্যবহার করার আগে যদি আমি বস্তুটি var_dump করি তবে সঠিক মানগুলি ফিরে আসবে। ক্লোনিং এটি ঠিক করে না, তাই আমি অনুমান করি যে এটির অ্যাক্সেসের সাথে এর আসলেই কিছু করার var_dumpআছে ... তারপরে আমি আপনার বিকল্প # 1 এবং ভয়েলি দেখেছি, এটি একটি অ্যারের হিসাবে অ্যাক্সেস করে ( $objCastAsArray['date']) একটি কবজির মতো কাজ করেছে।
আর্মফুট

4
ঘটনা # 0 : বস্তুগুলিতে অ্যারে কাস্ট করাতে প্রথমে কোনও দুর্গন্ধযুক্ত ধারণা তৈরি করা উচিত নয়। ফ্যাক্ট # 1 থেকে ফ্যাক্ট # 3: অবিবাহিত।
পেসারিয়ার

4
@ পেসারিয়র: আমি একমত যে এটি কিছুটা প্রশ্নবিদ্ধ, তবে এটি কিছু পরিস্থিতিতে সম্পূর্ণরূপে বোধ করতে পারে। যাইহোক, ম্যানুয়ালটিতে এটি যেমন কাজ করার জন্য নথিভুক্ত করা হয়েছে তাই আমাদের ব্যক্তিগত মতামত আসলেই কিছু যায় আসে না।
জন

অপশন # 3 এর বিকল্পের জন্য ইউটিএফ -8 প্রয়োজন হবে না$o = unserialize('O:8:"StdClass"' . substr(serialize($a),1));
অস্কার জে

10

কেন এই ব্যর্থতার কারণটি জনের সুস্পষ্ট ব্যাখ্যায় যুক্ত করতে চেয়েছিল wanted এরিয়া তৈরি করার সময়, পিএইচপি পূর্ণসংখ্যার কীগুলিকে রূপান্তর করে - যদি তা করতে পারে - যা অ্যারেগুলিতে কাস্ট করা হয়েছে এমন অ্যারেগুলিতে অনুসন্ধানের সমস্যা সৃষ্টি করে, কেবলমাত্র কারণ সংখ্যার কীটি সংরক্ষণ করা হয়। এটি সমস্যাযুক্ত কারণ সমস্ত সম্পত্তি অ্যাক্সেস বিকল্পগুলি স্ট্রিংগুলিতে প্রত্যাশা বা রূপান্তর করে। আপনি নিম্নলিখিতটি দ্বারা এটি নিশ্চিত করতে পারেন:

$arr = array('123' => 'abc');
$obj = (object) $arr;
$obj->{'123'} = 'abc';
print_r( $obj );

যা আউটপুট হবে:

stdClass Object ( 
  [123] => 'abc', 
  [123] => 'abc'
)

সুতরাং অবজেক্টের দুটি সম্পত্তি কী রয়েছে, একটি সংখ্যাসূচক (যা অ্যাক্সেস করা যায় না) এবং একটি স্ট্রিং ভিত্তিক। এই কারণেই জনের #Fact 4কাজ, কারণ কোঁকড়া ধনুর্বন্ধনী ব্যবহার করে সম্পত্তি সেট করার অর্থ আপনি সর্বদা সংখ্যার পরিবর্তে একটি স্ট্রিং-ভিত্তিক কী সংজ্ঞায়িত করেন।

জনের সমাধানটি গ্রহণ করে, তবে এটির মাথা ঘুরিয়ে দিয়ে আপনি আপনার অ্যারে থেকে এমন একটি বিষয় তৈরি করতে পারেন যা সর্বদা নিম্নলিখিত কাজগুলি করে স্ট্রিং-ভিত্তিক কী থাকে:

$obj = json_decode(json_encode($arr));

এখন থেকে আপনি নীচের যে কোনওটি ব্যবহার করতে পারেন কারণ এই পদ্ধতিতে অ্যাক্সেস সর্বদা কোঁকড়ানো ধনুর্বন্ধকের অভ্যন্তরের মানটিকে স্ট্রিংয়ে রূপান্তর করে:

$obj->{123};
$obj->{'123'};

ভাল পুরানো অযৌক্তিক পিএইচপি ...


1

যদি কোনও বস্তুর @মত শুরু হয় :

SimpleXMLElement Object (
    [@attributes] => Array (
        [href] => qwertyuiop.html
        [id] => html21
        [media-type] => application/xhtml+xml
    )
)

আপনাকে ব্যবহার করতে হবে:

print_r($parent_object->attributes());

কারণ $parent_object->{'@attributes'}বা $parent_object['@attributes']কাজ করবে না


3 বছর পরে এবং এটি এখনও মানুষকে সাহায্য করছে, ধন্যবাদ! আপনার উত্তর আমার সমস্যা সমাধানের সময় এটির কোনও ব্যাখ্যা নেই। এর পেছনের কারণটি কি কেউ ব্যাখ্যা করতে সক্ষম?
আরবিটার

1

নেট থেকে এই ফাংশনটি অনুলিপি করেছিলাম। যদি এটি যেমনটি বলে কাজ করে ("স্টাডক্লাস অবজেক্টগুলিকে বহুমাত্রিক অ্যারে রূপান্তর করতে ফাংশন"), তবে নিম্নলিখিত চেষ্টা করুন:

<?php

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

?>
  • প্রথমে আপনার অ্যারেটি objectToArrayফাংশনে পাস করুন
  • তারপরে রিটার্নের মানটি ধরুন
  • প্রতিধ্বনি [highlighting][448364][Data][0]

উত্স: পিএইচপি stdClass থেকে অ্যারে এবং অ্যারে থেকে stdClass


1

জনের ব্যাপক উত্তরের চূড়ান্ত বিকল্প:

দ্বিতীয় প্যারামিটারটি সত্য হিসাবে সেট করে কেবল json_decode () ব্যবহার করুন ।

$array = json_decode($url, true);

এরপরে এটি কোনও বস্তুর পরিবর্তে একটি সহযোগী অ্যারে প্রদান করে যাতে সত্যের পরে রূপান্তর করার দরকার নেই।

এটি প্রতিটি অ্যাপ্লিকেশনটির জন্য উপযুক্ত নাও হতে পারে তবে এটি সত্যই আমাকে সহজেই অরোগিনাল অবজেক্টের কোনও সম্পত্তি উল্লেখ করতে সহায়তা করেছিল।

এই টিউটোরিয়ালটিতে সমাধানটি পাওয়া গেছে - http://nitschinger.at/Handling-JSON- Like - a - boss- in- PHP/

শ্রদ্ধা


1

পিএইচপি 7 এর জন্য

সম্পত্তির নাম হিসাবে নম্বরযুক্ত বস্তুর বৈশিষ্ট্যে অ্যাক্সেস করা। বেশিরভাগ ক্ষেত্রে আপত্তি করতে অ্যারে কাস্টিংয়ের পরে প্রয়োজন।

    $arr = [2,3,7];
    $o = (object) $arr;

    $t = "1";
    $t2 = 1;
    $t3 = (1);

    echo $o->{1};      // 3
    echo $o->{'1'};   // 3
    echo $o->$t;        // 3
    echo $o->$t2;       // 3
    echo $o->$t3;       // 3

    echo $o->1;       // error
    echo $o->(1);      // error

0

আমি আশঙ্কা করছি যে আপনি সংখ্যার সাথে শুরু করে অবজেক্টের নাম দেওয়ার অনুমতি পাচ্ছেন না। একটি চিঠি দিয়ে শুরু করে প্রথমটির নামকরণ করুন "448364"।

দ্বিতীয়টি একটি অ্যারে, সেগুলি ব্র্যাকেটগুলি দ্বারা অ্যাক্সেস করা উচিত:

print myVar->highlighting->test_448364->Data[0]

পরিবর্তে


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