কীভাবে কোনও অ্যারে পিএইচপি-তে অবজেক্ট করবেন?


367

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

[128] => Array
    (
        [status] => Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
    )

[129] => Array
    (
        [status] => The other day at work, I had some spare time
    )

4
আপনি ঠিক কীভাবে কোন ধরণের অবজেক্ট পেতে চান? আমি যা বলতে চাইছি তা হল: গুণাবলীর কী হওয়া উচিত?
পাস্কাল মার্টিন

একটি লুপে এটি উভয়ই হওয়া উচিত কারণ স্থিতিটি একটি ডেটা অ্যারে তাই উভয়ই প্রিন্ট হয়
রাস্তারপ্রেডে

কখন থেকে নিশ্চিত না, তবে এটি কেবল কাজ করে:$a = (object)['hello' => 'world'];
নিশচল গৌতম

উত্তর:


588

সর্বাধিক সহজ ক্ষেত্রে, সম্ভবত এটির হিসাবে একটি অ্যারে "কাস্ট" যথেষ্ট:

$object = (object) $array;

অন্য বিকল্পটি হ'ল একটি চলক হিসাবে একটি মান শ্রেণি ইনস্ট্যান্ট করা এবং মানগুলি পুনরায় নির্ধারণের সময় আপনার অ্যারের মধ্য দিয়ে লুপ করা:

$object = new stdClass();
foreach ($array as $key => $value)
{
    $object->$key = $value;
}

এডসন মদিনা যেমন উল্লেখ করেছেন, অন্তর্নির্মিত json_ফাংশনগুলি ব্যবহার করা একটি সত্যই পরিষ্কার সমাধান :

$object = json_decode(json_encode($array), FALSE);

এটি (পুনরাবৃত্তভাবে) আপনার সমস্ত উপ-অ্যারেগুলিকে বস্তুতে রূপান্তরিত করে, যা আপনি চাইবেন বা নাও চান। দুর্ভাগ্যক্রমে এটির লুপিং পদ্ধতির উপর একটি 2-3x পারফরম্যান্স রয়েছে

সতর্কবাণী! (মন্তব্যের জন্য আল্ট্রা ধন্যবাদ):

বিভিন্ন পরিবেশে json_decode বিভিন্ন উপায়ে UTF-8 ডেটা রূপান্তর করে। স্থানীয়ভাবে '240.00' এবং উত্পাদনে '240' মানগুলি অর্জন করতে করতে - বিশাল বিপর্যয়। রূপান্তর যদি স্ট্রিং ব্যর্থ হয় তবে মুরওভারটি NUL হিসাবে ফিরে আসবে


41
"ভেরিয়েবল সংখ্যা হিসাবে শুরু করতে পারে না", হ্যাঁ তারা করতে পারে: $ অবজেক্ট -> {3} = 'xyz';
চেলমার্টজ

11
"একটি 2-3x পারফরম্যান্স হিট করেছে" এটি একটি অন্যায় তুলনা, কারণ পরবর্তী পদ্ধতিটি পুনরাবৃত্ত বস্তুগুলি প্রত্যাবর্তন করে, অন্যদিকে শর্ত ছাড়াই লুপিং পদ্ধতির (@ স্ট্রিটপ্রেডের উত্তরে) কেবল প্রথম স্তরে রূপান্তরিত করে।
ফিওলা

8
@ ফিফেলা আমি মোটেও অন্যায় বলে মনে করি না .. আমি উল্লেখ করেছি যে এটি রূপান্তর পুনরাবৃত্তি করে does এছাড়াও, 2-3x পারফরম্যান্স হিট একটি ফ্ল্যাট ইনপুট অ্যারে (যা কোনও পুনরাবৃত্তি ব্যবহার করবে না) ব্যবহার করে এসে পৌঁছেছিল
জেএলবি

6
সতর্কবার্তা! বিভিন্ন পরিবেশে json_decode বিভিন্ন উপায়ে UTF-8 ডেটা রূপান্তর করে। আমি স্থানীয়ভাবে '240.00' এবং উত্পাদনে '240' মানগুলি অর্জন করতে শুরু করি - ব্যাপক বিপর্যয়। রূপান্তর স্ট্রিং ব্যর্থ হলে মুরওভার NULL হিসাবে ফিরে আসে
সাইমন টোডা

1
নোট করুন যখন json_ * ফাংশনগুলি ব্যবহার করুন: মূল অ্যারেতে সঞ্চিত রেফারেন্সগুলি (যেমন অন্যান্য অ্যারেগুলিতে) এই ক্ষেত্রে সদৃশ হবে। xঅ্যারেতে থাকা কীটি অন্য অ্যারের রেফারেন্স ধারণ করে বলে । তারপরে $object->xআপনার ওয়ান-লাইনার কার্যকর হওয়ার পরে এটির একটি সদৃশ হবে $array['x'], মূল অ্যারের জন্য আর কোনও উল্লেখ নেই। এটি কিছু অ্যাপ্লিকেশনগুলিতে নিরীহ হতে পারে তবে বড় অ্যারেগুলির জন্য এটি মেমরির অপচয় করে এবং পরে যদি রেফারেন্সটি ব্যবহার করা হয় তবে মৃত্যুদন্ড কার্যকর করতে পারে।
কোপ্রোলাল

153

আপনি কেবল অ্যারেকে অবজেক্টে রূপান্তর করতে টাইপ কাস্টিং ব্যবহার করতে পারেন।

// *convert array to object* Array([id]=> 321313[username]=>shahbaz)
$object = (object) $array_name;

//now it is converted to object and you can access it.
echo $object->username;

107

সহজ উপায় হবে

$object = (object)$array;

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


2
কাজ করে না, আমি এখানে প্রশ্ন জিজ্ঞাসা করার আগে আমি তা করেছিলাম তাই
ডয়েটের

20
কেন তাকে বস্তু ব্যবহারের জন্য তার যুক্তি দিতে হবে? আমি মনে করি না যে এটি কীভাবে প্রাসঙ্গিক হয় । হয়ত সেগুলি জেসন_এনকোড করা বা সিরিয়ালাইজ করা দরকার? এটি করার কয়েকটি কারণ থাকতে পারে।
জুমব্যাট

হুম .. আমি ব্রাউজারের আউটপুটটিতে দেখেছি এটি দেখতে এই অবজেক্ট (stdClass) # 150 (130) looks [0] => অ্যারে (1) {["স্থিতি"] => স্ট্রিং (130) "দীর্ঘ শেষ ম্যাক এবং লিনাক্স ব্যবহারকারীদের ক্রোম জমিতে দ্বিতীয় শ্রেণির নাগরিকদের মতো বোধ করতে হবে না: তাদের কাছে অফিসিয়াল বিটা ভার্সিয়ো পেয়েছে… "} অফিসিয়ালি এটি একটি অবজেক্ট তবে কীভাবে এটিকে ছুঁড়ে ফেলা যায় যে আমি $ আপত্তি-> স্ট্যাটাসের মতো স্ট্যাটাসটি পেতে পারি কোনও ধারণা ?
রাস্তারপ্রেডে

জুমব্যাট, জেএসএন এনকোড কোনও অবজেক্ট ব্যবহার করার কোনও কারণ নয়, সেখানে অবজেক্টগুলি ব্যবহার করার জন্য json_encode () তে একটি পতাকা রয়েছে। সিরিয়ালাইজের সাহায্যে রিসিভারের দ্বারা প্রত্যাশিত নির্দিষ্ট অবজেক্টের ধরণের প্রয়োজন would এবং সাধারণভাবে আমি আসল সমস্যাটি নিয়ে সহায়তা করার চেষ্টা করি । আমার জন্য এই প্রশ্নটি বোঝায় যে অন্য কোথাও কোনও স্থাপত্যের ভুল রয়েছে।
জোহানেস

দুর্দান্ত, লারাভেল অ্যারের সাথে ইস্যুটি প্রকাশের জন্য কাজ করুন
অ্যান্টনি কাল

105

দ্রুত হ্যাক:

// assuming $var is a multidimensional array
$obj = json_decode (json_encode ($var), FALSE);

সুন্দর নয়, তবে কাজ করে।


2
আমি প্রকৃতপক্ষে এই সমাধানটি পছন্দ করি, ব্যবহারকারী-সংজ্ঞায়িতের পরিবর্তে ফাংশনে অন্তর্নির্মিত ব্যবহার করা সবসময় দ্রুত হয় এবং এটি দুর্দান্ত কাজ করে। ভকভগক.
আকনাটনে

@ অডড্যান্ট এটি উপরে উল্লিখিত সমস্যাটি সমাধান করে (একটি অ্যারেকে একটি বস্তুতে রূপান্তর করবে)। আপনার অভিমানগুলি আমার সমাধান নয়, মূল পোস্টে পরিচালিত হওয়া উচিত।
এডসন মদিনা

@ এডসনমেদিনা আমি করেছি, যদিও আমার পোস্টটি অনেকটা নিচে।
vdegenne

1
@ অডড্যান্ট, @ অ্যাডসনমিডিনার পক্ষে ন্যায়সঙ্গত হতে, মূল প্রশ্নটি বৈশিষ্ট্যগুলির কী দৃশ্যমানতা নির্দিষ্ট করে তা নির্দিষ্ট করে না, এবং যেহেতু অপারেটর $thisহিসাবে অনুসরণ করা মন্তব্যে ওপি ব্যবহার করেননি এটি ভারীভাবে বোঝানো হয়েছে যে তিনি / তিনি stdClassআউটপুট হিসাবে উদাহরণ চান এবং না কোনও ব্যবহারকারী-সংজ্ঞায়িত শ্রেণি যেমন আপনার উত্তর ব্যবহার করে। আমি এই সমাধানের কমনীয়তার সাথে একমত, তবে দুর্ভাগ্যক্রমে নেস্টেড অ্যারেগুলি দিয়ে এই সমস্যাটি সমাধান করার জন্য এটি বেশ সাধারণভাবে নিযুক্ত একটি প্যাটার্ন যেখানে বস্তুতে কাস্টিং কাজ করবে না। এটিও সম্ভব যে ওপি একটি ইন্টারফেস ব্যবহার করছে যা প্রয়োজনীয় এবং ইনপুট হিসাবে অ্যারে হিসাবে নয় এবং একটি অ্যারে ব্যবহার করে।
ডিকনডেস্পেরাদো

3
ভুলে যাবেন না যে এইভাবে ব্যবহার করে আপনি মূল ধরণগুলি বাদ দিয়ে সমস্ত হারাবেন। তারিখটাইম উদাহরণস্বরূপ রূপান্তরকারী হবে stdObject।
ডেনিস সেশেনভ

97

এখানে তিনটি উপায় রয়েছে:

  1. একটি আসল বস্তু জাল:

    class convert
    {
        public $varible;
    
        public function __construct($array)
        {
            $this = $array;
        }
    
        public static function toObject($array)
        {
            $array = new convert($array);
            return $array;
        }
    }
  2. অ্যারেটিকে একটি বস্তুতে কাস্ট করে একটি বস্তুতে রূপান্তর করুন:

    $array = array(
        // ...
    );
    $object = (object) $array;
  3. অ্যারেটিকে ম্যানুয়ালি কোনও বস্তুতে রূপান্তর করুন:

    $object = object;
    foreach ($arr as $key => $value) {
        $object->{$key} = $value;
    }

2
হুম ধন্যবাদ তবে আপনার ফেস ক্লাসটি নিম্নলিখিত ত্রুটিটি মারাত্মক ত্রুটি দেয়: এটি পুনরায় বরাদ্দ করা যায় না $ এটি /var/www/bot/inc/twitter-bot.php ইন লাইন 10
রাস্তারপ্রেডে

1
এবং টাইপক্যাসিন্ট @ রেফারেন্সটি খুব ভাল ধারণা নয় এমনকি এটি এখানে কাজ করবে না তা হ'ল আমি অপ্রত্যাশিত T_OBJECT_CAST পেয়েছি, T_NW বা T_STRING বা T_VARIABLE বা '$'
প্রত্যাশা করে

2
$ অ্যারে = & (অবজেক্ট) $ অ্যারে == সুন্দর KISS বাস্তবায়ন!
সাথি 64

16
কেন কেউ 2 এর চেয়ে আলাদা পদ্ধতি ব্যবহার করতে চাইবে)? কোন ডাউনসাইড আছে?
যোগু

7
বস্তুতে একটি অ্যারের টাইপকাস্ট করা নেস্টেড অ্যারেগুলিতে কাজ করে না
মিনহাজুল

34

এর সহজ উপায়, এটি পুনরাবৃত্ত অ্যারেগুলির জন্যও একটি অবজেক্ট তৈরি করবে:

$object = json_decode(json_encode((object) $yourArray), FALSE);

4
উত্তীর্ণ falseহওয়ার json_decode()ফলে একটি সহযোগী অ্যারে ফিরে আসবে।
মরিচা

3
@ ব্যবহারকারী 3284463 তে পাস trueকরা json_decodeকোনও সহযোগী অ্যারে ফিরিয়ে দেবে, falseএটি ডিফল্ট এবং একটি StdClassউদাহরণ ফিরে আসবে ।
ইলিয়ট রিড

23

আপনার কোথায় প্রয়োজন এবং কীভাবে অবজেক্টটিতে অ্যাক্সেস করবেন তার উপর নির্ভর করে এটি করার বিভিন্ন উপায় রয়েছে।

উদাহরণস্বরূপ: এটি কেবল টাইপকাস্ট করুন

$object =  (object) $yourArray;

তবে, সর্বাধিক সামঞ্জস্যপূর্ণ একটি ইউটিলিটি পদ্ধতি (এখনও পিএইচপি-র অংশ নয়) ব্যবহার করছেন যা স্ট্রিংয়ের উপর ভিত্তি করে স্ট্যান্ডার্ড পিএইচপি কাস্টিং প্রয়োগ করে যা প্রকারটি নির্দিষ্ট করে (বা এটিকে কেবল মূল্যটিকে ডি-রেফারেন্স করে উপেক্ষা করে):

/**
 * dereference a value and optionally setting its type
 *
 * @param mixed $mixed
 * @param null  $type (optional)
 *
 * @return mixed $mixed set as $type
 */
function rettype($mixed, $type = NULL) {
    $type === NULL || settype($mixed, $type);
    return $mixed;
}

আপনার ক্ষেত্রে ব্যবহারের উদাহরণ ( অনলাইন ডেমো ):

$yourArray = Array('status' => 'Figure A. ...');

echo rettype($yourArray, 'object')->status; // prints "Figure A. ..."

17

এই আমার জন্য কাজ করে

  function array_to_obj($array, &$obj)
  {
    foreach ($array as $key => $value)
    {
      if (is_array($value))
      {
      $obj->$key = new stdClass();
      array_to_obj($value, $obj->$key);
      }
      else
      {
        $obj->$key = $value;
      }
    }
  return $obj;
  }

function arrayToObject($array)
{
 $object= new stdClass();
 return array_to_obj($array,$object);
}

ব্যবহার:

$myobject = arrayToObject($array);
print_r($myobject);

ফেরত:

    [127] => stdClass Object
        (
            [status] => Have you ever created a really great looking website design
        )

    [128] => stdClass Object
        (
            [status] => Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
        )

    [129] => stdClass Object
        (
            [status] => The other day at work, I had some spare time
        )

স্বাভাবিকের মতো আপনি এটিকে লুপ করতে পারেন:

foreach($myobject as $obj)
{
  echo $obj->status;
}

তবে এটি টাইপ কাস্টিংয়ের চেয়ে প্রায় 500% ধীর (পরীক্ষিত): $জেজ = (অবজেক্ট) $ অ্যারে;
xZero

@ xZero কিন্তু $obj = (object) $array;বহুমাত্রিক অ্যারেগুলির জন্য কাজ করে না।
জেফ

15

আমি যতদূর জানি সচেতনভাবে এটি করার কোনও অন্তর্নির্মিত পদ্ধতি নেই তবে এটি সাধারণ লুপের মতোই সহজ:

    $obj= new stdClass();

    foreach ($array as $k=> $v) {
        $obj->{$k} = $v;
    }

আপনার যদি প্রয়োজন হয় পুনরাবৃত্তভাবে আপনার অবজেক্টটি তৈরি করতে আপনার এটির ব্যাখ্যা করতে পারেন।


14

আপনার অ্যারেটিকে কোনও বস্তুতে রূপান্তর করতে আপনি (অবজেক্ট) ফাংশনটি ব্যবহার করতে পারেন।

$arr= [128=> ['status'=>
                 'Figure A. Facebook \'s horizontal scrollbars showing up on a 1024x768 screen resolution.'],
                  129=>['status'=>'The other day at work, I had some spare time']];

            $ArrToObject=(object)$arr;
            var_dump($ArrToObject);

ফলাফলটি এমন একটি বস্তু হবে যাতে অ্যারে রয়েছে:

অবজেক্ট (stdClass) # 1048 (2) {[128] => অ্যারে (1)

["স্থিতি"] => স্ট্রিং (87) "চিত্র এ। ফেসবুকের অনুভূমিক স্ক্রোলবারগুলি 1024x768 স্ক্রিন রেজোলিউশনে প্রদর্শিত হচ্ছে" " }

[129] => অ্যারে (1) {["স্থিতি"] => স্ট্রিং (44) "অন্য দিন কর্মক্ষেত্রে আমার কিছুটা অতিরিক্ত সময় ছিল"}}


9

আসলে আপনি যদি বহুমাত্রিক অ্যারেগুলির সাথে এটি ব্যবহার করতে চান তবে আপনি কিছু পুনরাবৃত্তি ব্যবহার করতে চাইবেন।

static public function array_to_object(array $array)
{
    foreach($array as $key => $value)
    {
        if(is_array($value))
        {
            $array[$key] = self::array_to_object($value);
        }
    }
    return (object)$array;
}

8

আমি অবশ্যই এর মতো পরিষ্কার পথে যেতে চাই:

<?php

class Person {

  private $name;
  private $age;
  private $sexe;

  function __construct ($payload)
  {
     if (is_array($payload))
          $this->from_array($payload);
  }


  public function from_array($array)
  {
     foreach(get_object_vars($this) as $attrName => $attrValue)
        $this->{$attrName} = $array[$attrName];
  }

  public function say_hi ()
  {
     print "hi my name is {$this->name}";
  }
}

print_r($_POST);
$mike = new Person($_POST);
$mike->say_hi();

?>

যদি আপনি জমা দিন:

formulaire

আপনি এটি পাবেন:

মাইক

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

এছাড়াও get_object_vars ব্যবহার করে তা নিশ্চিত করে যে ম্যানিপুলেটেড অবজেক্টে কোনও অতিরিক্ত গুণাবলী তৈরি করা হয়নি (আপনি কোনও পরিবারের নাম সম্বলিত গাড়ি চাইছেন না এবং কোনও ব্যক্তি 4 চাকার আচরণ করছেন)।


আপনি কেন $ অ্যারে [$ অ্যাটার_নেম] এর পরিবর্তে $ অ্যাট্রি_মূল্য ব্যবহার করবেন না; _প্রিয় (ray অ্যারে) ফাংশন থেকে আপনার
গণপরিষদে

7

আপনি একটি অ্যারেওজেক্টও ব্যবহার করতে পারেন, উদাহরণস্বরূপ:

<?php
    $arr = array("test",
                 array("one"=>1,"two"=>2,"three"=>3), 
                 array("one"=>1,"two"=>2,"three"=>3)
           );
    $o = new ArrayObject($arr);
    echo $o->offsetGet(2)["two"],"\n";
    foreach ($o as $key=>$val){
        if (is_array($val)) {
            foreach($val as $k => $v) {
               echo $k . ' => ' . $v,"\n";
            }
        }
        else
        {
               echo $val,"\n";
        }
    }
?>

//Output:
  2
  test
  one => 1
  two => 2
  three => 3
  one => 1
  two => 2
  three => 3

1
আমার মতে এটি সেরা উত্তর হওয়া উচিত। আরও তথ্যের তথ্য: php.net/manual/en/arrayobject.construct.php
জুলিয়ান

7

আমি যেটি ব্যবহার করি (এটি একটি শ্রেণীর সদস্য):

const MAX_LEVEL = 5; // change it as needed

public function arrayToObject($a, $level=0)
{

    if(!is_array($a)) {
        throw new InvalidArgumentException(sprintf('Type %s cannot be cast, array expected', gettype($a)));
    }

    if($level > self::MAX_LEVEL) {
        throw new OverflowException(sprintf('%s stack overflow: %d exceeds max recursion level', __METHOD__, $level));
    }

    $o = new stdClass();
    foreach($a as $key => $value) {
        if(is_array($value)) { // convert value recursively
            $value = $this->arrayToObject($value, $level+1);
        }
        $o->{$key} = $value;
    }
    return $o;
}

7

সামান্য জটিল তবে প্রসারিত করার কৌশল সহজ:

ধরুন আপনার অ্যারে আছে

$a = [
     'name' => 'ankit',
     'age' => '33',
     'dob' => '1984-04-12'
];

মনে করুন আপনার কাছে এমন একটি ব্যক্তি শ্রেণি রয়েছে যা এই অ্যারে থেকে কম-বেশি বৈশিষ্ট্যযুক্ত হতে পারে। উদাহরণ স্বরূপ

class Person 
{
    private $name;
    private $dob;
    private $age;
    private $company;
    private $city;
}

যদি আপনি এখনও নিজের অ্যারেটিকে ব্যক্তির উদ্দেশ্যে পরিবর্তন করতে চান তবে। আপনি অ্যারেআইটারেটর ক্লাস ব্যবহার করতে পারেন।

$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.

এখন আপনার কাছে আইট্রেটর অবজেক্ট রয়েছে।

ফিল্টারইট্রেটার ক্লাস প্রসারিত একটি শ্রেণি তৈরি করুন; আপনি বিমূর্ত পদ্ধতি গ্রহণ সংজ্ঞায়িত করতে হবে। উদাহরণ অনুসরণ

class PersonIterator extends \FilterIterator
{
    public function accept()
    {
        return property_exists('Person', parent::current());
    }
}

উপরের ইমপ্লিমেন্টেশনটি শ্রেণিতে বিদ্যমান থাকলেই সম্পত্তি বেঁধে দেওয়া হবে।

পার্সনআইটিটার শ্রেণিতে আরও একটি পদ্ধতি যুক্ত করুন

public function getObject(Person $object)
{
        foreach ($this as $key => $value)
        {
            $object->{'set' . underscoreToCamelCase($key)}($value);
        }
        return $object;
}

আপনার শ্রেণিতে নির্ধারিত মিউটর রয়েছে তা নিশ্চিত করুন। এখন আপনি এই ফাংশনটি কল করতে প্রস্তুত যেখানে আপনি অবজেক্ট তৈরি করতে চান।

$arrayiterator = new \ArrayIterator($a);
$personIterator = new \PersonIterator($arrayiterator);

$personIterator->getObject(); // this will return your Person Object. 

6

পুনরাবৃত্তি আপনার বন্ধু:

function __toObject(Array $arr) {
    $obj = new stdClass();
    foreach($arr as $key=>$val) {
        if (is_array($val)) {
            $val = __toObject($val);
        }
        $obj->$key = $val;
    }

    return $obj;
}

6

এর জন্য পিএইচপি 7 প্রয়োজন কারণ আমি মূল ফাংশনের মধ্যে 'ইন্টার্নফানক' লক করতে ল্যাম্বডা ফাংশনটি বেছে নিয়েছিলাম। ল্যাম্বডা ফাংশনটিকে পুনরাবৃত্তভাবে বলা হয়, তাই এর জন্য প্রয়োজন: "ব্যবহার (& $ অভ্যন্তরীণ ফান)"। আপনি এটি পিএইচপি 5 এ করতে পারেন তবে অভ্যন্তরীণ কাজটি আড়াল করতে পারেন নি।

function convertArray2Object($defs) {
    $innerfunc = function ($a) use ( &$innerfunc ) {
       return (is_array($a)) ? (object) array_map($innerfunc, $a) : $a; 
    };
    return (object) array_map($innerfunc, $defs);
}

5

আমি তৈরি এই ফাংশনটি ব্যবহার করুন:

function buildObject($class,$data){
    $object = new $class;
    foreach($data as $key=>$value){
        if(property_exists($class,$key)){
            $object->{'set'.ucfirst($key)}($value);
        }
    }
    return $object;
}

ব্যবহার:

$myObject = buildObject('MyClassName',$myArray);

5

এক রৈখিক

$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));

1
নোট করুন যে মূল অ্যারেতে সঞ্চিত রেফারেন্সগুলি (যেমন অন্যান্য অ্যারেগুলিতে) এই ওয়ান-লাইনার দ্বারা সদৃশ হবে। xঅ্যারেতে থাকা কীটি অন্য অ্যারের রেফারেন্স ধারণ করে বলে । তারপরে $object->xআপনার ওয়ান-লাইনার কার্যকর হওয়ার পরে এটির $result_array['x']অনুরূপ অ্যারে নয়, এর সদৃশ হবে ।
কোপ্রোলাল

4

সহজ:

$object = json_decode(json_encode($array));

উদাহরণ:

$array = array(
    'key' => array(
        'k' => 'value',
    ),
    'group' => array('a', 'b', 'c')
);

$object = json_decode(json_encode($array));

তারপরে, নিম্নলিখিতটি সত্য:

$object->key->k === 'value';
$object->group === array('a', 'b', 'c')

1
আমি মনে করি এটি একদম কাজ নয়। কেন জসনে একটি অ্যারে এনকোড করে তারপরে ডিকোড করুন? এটি আমার পক্ষে অনুকূল সিদ্ধান্ত নয়।
জুলিয়ান

1
@ জুলিয়ান, কারণ এটি পুনরাবৃত্তভাবে কাজ করে, এটি সঠিকভাবে সংজ্ঞায়িত এবং পর্যাপ্ত নির্ভরযোগ্য ("স্ট্যান্ডার্ড") উপায়ে কাজ করে, এবং এলোমেলো হাতে-কোডেড বানর যাদুবিদ্যার একটি ভাল বিকল্প হিসাবে যথেষ্ট দ্রুতও।
জেড

3

একটি নতুন অবজেক্ট তৈরি করতে আপনি ভেরিয়েবলের বাম দিকে (অবজেক্ট) যুক্ত করে এটিও করতে পারেন।

<?php
$a = Array
    ( 'status' => " text" );
var_dump($a);
$b = (object)$a;
var_dump($b);
var_dump($b->status);

http://codepad.org/9YmD1KsU


1
সম্ভবত এটি উল্লেখযোগ্যভাবে " ingালাই " বা "টাইপ কাস্টিং" বলা হয়: php.net/manual/en/… এবং (অবজেক্ট) অ্যারের আচরণ () এখানে ডকুমেন্টেড রয়েছে: php.net/manual/en/…
পিট

2

json_encodeইউটিএফ -8 নন ডেটা যেভাবে পরিচালনা করে তা ব্যবহার করা সমস্যাযুক্ত। এটি লক্ষণীয় যে json_encode/ json_encodeপদ্ধতিটি অ-অ্যাসোসিয়েটিভ অ্যারেগুলিকে অ্যারে হিসাবে ছেড়ে দেয়। এটি আপনি যা চান তা হতে পারে বা নাও পারে। আমি সম্প্রতি এই সমাধানটির কার্যকারিতাটি পুনরায় তৈরি করার প্রয়োজনে ফাংশন ব্যবহার না করেই অবস্থানে ছিলাম json_। আমি এখানে যা এলাম তা এখানে:

/**
 * Returns true if the array has only integer keys
 */
function isArrayAssociative(array $array) {
    return (bool)count(array_filter(array_keys($array), 'is_string'));
}

/**
 * Converts an array to an object, but leaves non-associative arrays as arrays. 
 * This is the same logic that `json_decode(json_encode($arr), false)` uses.
 */
function arrayToObject(array $array, $maxDepth = 10) {
    if($maxDepth == 0) {
        return $array;
    }

    if(isArrayAssociative($array)) {
        $newObject = new \stdClass;
        foreach ($array as $key => $value) {
            if(is_array($value)) {
                $newObject->{$key} = arrayToObject($value, $maxDepth - 1);
            } else {
                $newObject->{$key} = $value;
            }
        }
        return $newObject;
    } else {

        $newArray = array();
        foreach ($array as $value) {
            if(is_array($value)) {
                $newArray[] = arrayToObject($value, $maxDepth - 1);
            } else {
                $newArray[] = $value;
            }                
        }
        return $newArray;
    }
}

2

বিশ্বের সেরা পদ্ধতি :)

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

আপনি যদি বিভিন্ন পদ্ধতি ব্যবহার করেন তবে আপনার সমস্যা হবে। এটি সেরা পদ্ধতি। আপনি কখনও দেখেছেন।


2

একটি বস্তুতে বহুমাত্রিক অ্যারে। এই কোডটি বিং সার্চ এপিআই চেষ্টা এবং ধরার পদ্ধতিতে রূপান্তর করার জন্য ব্যবহৃত হয়।

try {
        // Perform the Web request and get the JSON response
        $context = stream_context_create($options);
        $results = file_get_contents($url . "?cc=" . $country . "&category=" . $type, false, $context);
        $results = json_decode($results);
        return response()->json($results);
    } catch (\Exception $e) {
        $results = array('value' => array(
                (object) array(
                    "name" => "Unable to Retrive News",
                    "url" => "http://www.sample.com/",
                    "image" => (object) array("thumbnail" => (object) array("contentUrl" => "")),
                    "publishedAt" => "",
                    "description" => "")
            )
        );
        $results = (object) $results;
        return response()->json($results);
    }

2

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

<?php

$array = ['name'=>'maria','age'=>33];

class Person {

    public $name;
    public $age;

    public function __construct(string $name, string $age){
        $this->name  = $name;
        $this->age = $age;
    }
}

function arrayToObject(array $array, string $class_name){

    $r = new ReflectionClass($class_name);
    $object = $r->newInstanceWithoutConstructor();
    $list = $r->getProperties();
    foreach($list as $prop){
      $prop->setAccessible(true);
      if(isset($array[$prop->name]))
        $prop->setValue($object, $array[$prop->name]);
    } 

    return $object;

}

$pessoa1 = arrayToObject($array, 'Person');
var_dump($pessoa1);

1

কেকপিএইচপিতে একটি পুনরাবৃত্ত সেট: মানচিত্র শ্রেণি রয়েছে যা মূলত একটি বস্তুর মধ্যে একটি অ্যারে মানচিত্র করে। আপনি যেমন চাইছেন তেমনভাবে চেহারাটি তৈরি করতে আপনার অ্যারে দেখতে কেমন তা পরিবর্তন করতে হবে।

http://api.cakephp.org/view_source/set/#line-158

সবচেয়ে খারাপ ক্ষেত্রে, আপনি এই ফাংশন থেকে কয়েকটি ধারণা পেতে সক্ষম হতে পারেন।


1

স্পষ্টতই কিছু অন্যান্য লোকদের উত্তরগুলির একটি এক্সট্রাপোলেশন, তবে এখানে পুনরাবৃত্ত ফাংশনটি যে কোনও মাল্চ-ডাইমেনশনাল অ্যারেকে কোনও বস্তুতে রূপান্তরিত করবে:

   function convert_array_to_object($array){
      $obj= new stdClass();
      foreach ($array as $k=> $v) {
         if (is_array($v)){
            $v = convert_array_to_object($v);   
         }
         $obj->{strtolower($k)} = $v;
      }
      return $obj;
   }

এবং মনে রাখবেন যে অ্যারেতে যদি সংখ্যাসূচক কীগুলি থাকে তবে তারা ব্যবহারের ফলে ফলাফলের ক্ষেত্রে এখনও উল্লেখ করা যেতে পারে {}(উদাহরণস্বরূপ $obj->prop->{4}->prop:)


1

এই সমস্ত কোড দ্বারা অনুপ্রাণিত হয়ে, আমি সমর্থন সহ একটি বর্ধিত সংস্করণ তৈরি করার চেষ্টা করেছি: নির্দিষ্ট শ্রেণীর নাম, নির্মাণকারী পদ্ধতি এড়ানো, 'মটরশুটি' প্যাটার্ন এবং কঠোর মোড (কেবল বিদ্যমান বৈশিষ্ট্যগুলি সেট করুন):

    class Util {

static function arrayToObject($array, $class = 'stdClass', $strict = false) {
        if (!is_array($array)) {
            return $array;
        }

        //create an instance of an class without calling class's constructor
        $object = unserialize(
                sprintf(
                        'O:%d:"%s":0:{}', strlen($class), $class
                )
        );

        if (is_array($array) && count($array) > 0) {
            foreach ($array as $name => $value) {
                $name = strtolower(trim($name));
                if (!empty($name)) {

                    if(method_exists($object, 'set'.$name)){
                        $object->{'set'.$name}(Util::arrayToObject($value));
                    }else{
                        if(($strict)){

                            if(property_exists($class, $name)){

                                $object->$name = Util::arrayToObject($value); 

                            }

                        }else{
                            $object->$name = Util::arrayToObject($value); 
                        }

                    }

                }
            }
            return $object;
        } else {
            return FALSE;
        }
        }
}

1

কোড

এই ফাংশন হিসাবে একই কাজ করে json_decode(json_encode($arr), false)

function arrayToObject(array $arr)
{
    $flat = array_keys($arr) === range(0, count($arr) - 1);
    $out = $flat ? [] : new \stdClass();

    foreach ($arr as $key => $value) {
        $temp = is_array($value) ? $this->arrayToObject($value) : $value;

        if ($flat) {
            $out[] = $temp;
        } else {
            $out->{$key} = $temp;
        }
    }

    return $out;
}

পরীক্ষামূলক

পরীক্ষা 1: ফ্ল্যাট অ্যারে

$arr = ["a", "b", "c"];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

আউটপুট:

array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)
array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)

পরীক্ষা 2: বস্তুর অ্যারে

$arr = [["a" => 1], ["a" => 1], ["a" => 1]];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

আউটপুট:

array(
    0 => stdClass::__set_state(array('a' => 1,)),
    1 => stdClass::__set_state(array('a' => 1,)),
    2 => stdClass::__set_state(array('a' => 1,)),
)
array(
    0 => stdClass::__set_state(array('a' => 1,)),
    1 => stdClass::__set_state(array('a' => 1,)),
    2 => stdClass::__set_state(array('a' => 1,)),
)

পরীক্ষা 3: অবজেক্ট

$arr = ["a" => 1];
var_export(json_decode($arr));
var_export($this->arrayToObject($arr));

আউটপুট:

stdClass::__set_state(array('a' => 1,))
stdClass::__set_state(array('a' => 1,))

0

আমি এটি বেশ সহজ উপায়ে সম্পন্ন করেছি,

    $list_years         = array();
    $object             = new stdClass();

    $object->year_id   = 1 ;
    $object->year_name = 2001 ;
    $list_years[]       = $object;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.