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


541

আমি ব্যবহার করে একটি অদ্ভুত ত্রুটি পেয়েছি json_decode()। এটি সঠিকভাবে ডেটা ডিকোড করে (আমি এটি ব্যবহার করে দেখেছি print_r), কিন্তু যখন আমি অ্যারের ভিতরে তথ্য অ্যাক্সেস করার চেষ্টা করি তখন:

Fatal error: Cannot use object of type stdClass as array in
C:\Users\Dail\software\abs.php on line 108

আমি কেবল করার চেষ্টা করেছি: $result['context']কোথা $resultথেকে ডেটা ফিরে এসেছেjson_decode()

আমি কীভাবে এই অ্যারের ভিতরে মানগুলি পড়তে পারি?


15
$ ফলাফল = json_decode ('স্ট্রিং', সত্য); সত্য সংযোজন ফলাফল একটি অ্যারে হিসাবে এবং stdClass না হিসাবে ফলাফল দেয়।
নেপালুজ

উত্তর:


788

json_decodeএটির অ্যারে ফিরিয়ে আনতে দ্বিতীয় প্যারামিটারটি ব্যবহার করুন :

$result = json_decode($data, true);

209

ফাংশনটি json_decode()ডিফল্টরূপে কোনও বস্তু ফেরত দেয়।

আপনি এই জাতীয় ডেটা অ্যাক্সেস করতে পারেন:

var_dump($result->context);

আপনার যদি শনাক্তকারীদের মতো থাকে from-date(উপরের পদ্ধতিটি ব্যবহার করার সময় হাইফেন পিএইচপি ত্রুটি ঘটাতে পারে) আপনাকে লিখতে হবে:

var_dump($result->{'from-date'});

আপনি যদি অ্যারে চান তবে আপনি এই জাতীয় কিছু করতে পারেন:

$result = json_decode($json, true);

অথবা বস্তুকে একটি অ্যারেতে ফেলে দিন:

$result = (array) json_decode($json);

2
পিএইচপি-র _ডাস্ট্রয় মানকে নকআউটজেস দ্বারা নির্ধারিত করার উপায় খুঁজে পাওয়ার চেষ্টা করার সময় আমাকে এটি খুঁজে পেতে কিছুটা সময় নিয়েছিল, তাই +1
ডেল্ট্রি

2
এই উত্তরটি প্রথম (সবচেয়ে রেটযুক্ত) উত্তরের চেয়ে অনেক বেশি যোগ্য!
মোজতাবা রেজাeীয়

149

আপনাকে অবশ্যই ->এটির কোনও অবজেক্ট ব্যবহার করে এটি অ্যাক্সেস করতে হবে ।

থেকে আপনার কোড পরিবর্তন করুন:

$result['context'];

প্রতি:

$result->context;

আমার যে সমস্যাটি হয়েছে তা শর্তসাপেক্ষে সম্পত্তিটি ব্যবহার করার চেষ্টা করছি যার if ($result->context = $var) ফলে সম্পত্তিটি ভারে সেট করা যায় এবং সত্যই ফিরে আসে, তা কোনও ব্যাপার নয়।
এসটিউইলসন

3
@ এসটিউইলসনের আপনার দ্বিগুণ সমান ব্যবহার করা উচিত ==, আপনার বর্তমান অবস্থায় আপনি একটি একক সমান ব্যবহার করে $varমান নির্ধারণ $result->contextকরছেন =। এবং প্রভু এটি if statementপড়বেন যেন এটি খালি বা না, এবং যদি $varএর মান থাকে তবে এর অর্থ এটি খালি নয় এবং সর্বদা সত্য ফিরে আসবে।
জিএনেক্সাস

89

আজ একই সমস্যা, এর মতো সমাধান করা:

আপনি যদি কল করেন তবে json_decode($somestring)আপনি একটি অবজেক্ট পাবেন এবং আপনার পছন্দ মতো অ্যাক্সেস করতে হবে $object->keyতবে আপনি যদি কল করেন তবে json_decode($somestring, true)আপনি একটি অভিধান পাবেন এবং পছন্দ মতো অ্যাক্সেস করতে পারবেন$array['key']


2
এটি আমাকে অনেক সময় বাঁচিয়েছে! আমি প্রকৃত প্যারামিটারটি
রাখছিলাম

87

trueদ্বিতীয় প্যারামিটার হিসাবে ব্যবহার করুন json_decode। এটি stdObjectউদাহরণস্বরূপ পরিবর্তে জসনকে একটি সহযোগী অ্যারে রূপান্তর করবে :

$my_array = json_decode($my_json, true);

আরও বিশদ জন্য ডকুমেন্টেশন দেখুন ।



28

যেমন পিএইচপি ম্যানুয়াল বলে,

মুদ্রণ_আর - একটি পরিবর্তনশীল সম্পর্কে মানব-পঠনযোগ্য তথ্য মুদ্রণ করে

যখন আমরা ব্যবহার করি json_decode();, আমরা রিটার্ন টাইপ হিসাবে stdClass টাইপের একটি অবজেক্ট পাই। আর্গুমেন্টগুলি, যা ভিতরে প্রবেশ করতে হবে print_r()তা হয় একটি অ্যারে বা একটি স্ট্রিং হওয়া উচিত। অত: পর, আমরা একটি অবজেক্ট ভিতরে প্রেরণ করতে পারবেন না print_r()। আমি এটি মোকাবেলায় 2 টি উপায় খুঁজে পেয়েছি।

  1. অ্যারেতে বস্তুটি কাস্ট করুন।
    এটি নিম্নলিখিত হিসাবে অর্জন করা যেতে পারে।

    $a = (array)$object;

  2. পূর্বে উল্লিখিত হিসাবে অবজেক্টের কীটি অ্যাক্সেস করে আপনি json_decode();ফাংশনটি ব্যবহার করেন , এটি স্টাডক্লাসের একটি অবজেক্ট প্রদান করে। আপনি ->অপারেটরের সাহায্যে অবজেক্টের উপাদানগুলিতে অ্যাক্সেস করতে পারেন ।

    $value = $object->key;

এক, যদি বস্তুটি নেস্টেড অ্যারে করে থাকে তবে সাব এলিমেন্টগুলি বের করতে একাধিক কী ব্যবহার করতে পারে can

$value = $object->key1->key2->key3...;

তাদের অন্যান্য অপশন আছে print_r()পাশাপাশি, মত var_dump();এবংvar_export();

দ্রষ্টব্য : এছাড়াও, আপনি দ্বিতীয় প্যারামিটার সেট করেন তাহলে json_decode();থেকে true, এটি স্বয়ংক্রিয়ভাবে একটি বস্তুর রূপান্তর করবে array();
এখানে কিছু উল্লেখ আছে:
http://php.net/manual/en/function.print-r.php
HTTP: // php.net/manual/en/function.var-dump.php
http://php.net/manual/en/function.var-export.php


12

কোনও জসন স্ট্রিং থেকে ফলাফল হিসাবে একটি অ্যারে পেতে আপনার দ্বিতীয় বুলিয়ান সত্য হিসাবে সেট করা উচিত।

$result = json_decode($json_string, true);
$context = $result['context'];

অন্যথায় $ ফলাফল একটি স্ট্যান্ড অবজেক্ট হবে। তবে আপনি অবজেক্ট হিসাবে মানগুলি অ্যাক্সেস করতে পারেন।

  $result = json_decode($json_string);
 $context = $result->context;


8

আপনি যখন এটির মতো অ্যাক্সেস করার চেষ্টা করেন $result['context'], আপনি এটিকে অ্যারের হিসাবে বিবেচনা করেন, ত্রুটি এটি আপনাকে বলছে যে আপনি আসলে কোনও বস্তুর সাথে আচরণ করছেন, তারপরে আপনার এটির মতো অ্যাক্সেস করা উচিত$result->context


4

এখানে ফাংশন স্বাক্ষর:

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

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

যখন পরম সত্য হয়, এটি সংঘবদ্ধ অ্যারেগুলি ফিরিয়ে দেবে।

এটি ত্রুটিতে NULL ফিরিয়ে দেবে।

আপনি যদি অ্যারের মাধ্যমে মান আনতে চান তবে এসোসিয়েসকে সত্যে সেট করুন।


3

কখনও কখনও এপিআইয়ের সাথে কাজ করার সময় আপনি কেবল কোনও অবজেক্টকে কোনও অবজেক্ট রাখতে চান। নেস্টেট অবজেক্টস রয়েছে এমন অবজেক্টটি অ্যাক্সেস করতে আপনি নিম্নলিখিতটি করতে পারেন:

আমরা ধরে নেব যখন আপনি যে জিনিসটি এটি মুদ্রণ করতে পারবেন তখন আপনি এটি দেখতে পাবেন:

print_r($response);

stdClass object
(
    [status] => success
    [message] => Some message from the data
    [0] => stdClass object
        (
            [first] => Robert
            [last] => Saylor
            [title] => Symfony Developer
        )
    [1] => stdClass object
        (
            [country] => USA
        )
)

বস্তুর প্রথম অংশ অ্যাক্সেস করতে:

print $response->{'status'};

এবং এটি "সাফল্য" আউটপুট হবে

এবার আসুন অন্য অংশগুলি কী:

$first = $response->{0}->{'first'};
print "First name: {$first}<br>";

প্রত্যাশিত আউটপুটটি একটি লাইন ব্রেক সহ "রবার্ট" হবে।

আপনি বস্তুর অংশটি অন্য কোনও বস্তুকে পুনরায় বরাদ্দ করতে পারেন।

$contact = $response->{0};
print "First Name: " . $contact->{'first'} . "<br>";

প্রত্যাশিত আউটপুটটি একটি লাইন ব্রেক সহ "রবার্ট" হবে।

পরবর্তী কী "1" অ্যাক্সেস করতে প্রক্রিয়াটি একই।

print "Country: " . $response->{1}->{'country'} . "<br>";

প্রত্যাশিত আউটপুট হবে "মার্কিন যুক্তরাষ্ট্র"

আশা করি এটি আপনাকে অবজেক্টগুলি বুঝতে সহায়তা করবে এবং আমরা কেন কোনও বস্তুকে একটি অবজেক্ট রাখতে চাই। আপনাকে কোনও বস্তুর বৈশিষ্ট্য অ্যাক্সেস করতে একটি অ্যারেতে রূপান্তর করতে হবে না।


2

বন্ধনী ব্যবহারের পরিবর্তে অবজেক্ট অপারেটর ব্যবহার করুন উদাহরণস্বরূপ, ডাটাবেস অবজেক্টের উপর ভিত্তি করে আমার অ্যারেটি ডিবি নামে একটি শ্রেণিতে তৈরি করা হয়েছে:

class DB {
private static $_instance = null;
private $_pdo,
        $_query, 
        $_error = false,
        $_results,
        $_count = 0;



private function __construct() {
    try{
        $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') .';dbname=' . Config::get('mysql/db') , Config::get('mysql/username') ,Config::get('mysql/password') );


    } catch(PDOException $e) {
        $this->_error = true;
        $newsMessage = 'Sorry.  Database is off line';
        $pagetitle = 'Teknikal Tim - Database Error';
        $pagedescription = 'Teknikal Tim Database Error page';
        include_once 'dbdown.html.php';
        exit;
    }
    $headerinc = 'header.html.php';
}

public static function getInstance() {
    if(!isset(self::$_instance)) {
        self::$_instance = new DB();
    }

    return self::$_instance;

}


    public function query($sql, $params = array()) {
    $this->_error = false;
    if($this->_query = $this->_pdo->prepare($sql)) {
    $x = 1;
        if(count($params)) {
        foreach($params as $param){
            $this->_query->bindValue($x, $param);
            $x++;
            }
        }
    }
    if($this->_query->execute()) {

        $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
        $this->_count = $this->_query->rowCount();

    }

    else{
        $this->_error = true;
    }

    return $this;
}

public function action($action, $table, $where = array()) {
    if(count($where) ===3) {
        $operators = array('=', '>', '<', '>=', '<=');

        $field      = $where[0];
        $operator   = $where[1];
        $value      = $where[2];

        if(in_array($operator, $operators)) {
            $sql = "{$action} FROM {$table} WHERE {$field} = ?";

            if(!$this->query($sql, array($value))->error()) {
            return $this;
            }
        }

    }
    return false;
}

    public function get($table, $where) {
    return $this->action('SELECT *', $table, $where);

public function results() {
    return $this->_results;
}

public function first() {
    return $this->_results[0];
}

public function count() {
    return $this->_count;
}

}

নিয়ামক স্ক্রিপ্টে আমি এই কোডটি ব্যবহার করি এমন তথ্য অ্যাক্সেস করতে:

<?php
$pagetitle = 'Teknikal Tim - Service Call Reservation';
$pagedescription = 'Teknikal Tim Sevice Call Reservation Page';
require_once $_SERVER['DOCUMENT_ROOT'] .'/core/init.php';
$newsMessage = 'temp message';

$servicecallsdb = DB::getInstance()->get('tt_service_calls', array('UserID',
 '=','$_SESSION['UserID']));

if(!$servicecallsdb) {
// $servicecalls[] = array('ID'=>'','ServiceCallDescription'=>'No Service Calls');
} else {
$servicecalls = $servicecallsdb->results();
}
include 'servicecalls.html.php';



?>

তারপরে সার্ভিসেকলগুলি সেট করা আছে এবং 0 এর চেয়ে বেশি একটি গণনা রয়েছে কিনা তা যাচাই করে দেখানোর জন্য আমি যে তথ্যটি পরীক্ষা করে দেখছি তা মনে রাখবেন এটি আমি যে রেফারেন্স দিচ্ছি না সেটি তাই আমি অবজেক্ট অপারেটরের সাথে "->" রেকর্ডগুলি অ্যাক্সেস করতে পারি:

<?php include $_SERVER['DOCUMENT_ROOT'] .'/includes/header.html.php';?>
<!--Main content-->
<div id="mainholder"> <!-- div so that page footer can have a minum height from the
  header -->
<h1><?php if(isset($pagetitle)) htmlout($pagetitle);?></h1>
<br>
<br>
<article>
    <h2></h2>
</article>
<?php
if (isset($servicecalls)) {
if (count ($servicecalls) > 0){
     foreach ($servicecalls as $servicecall) {
        echo '<a href="https://stackoverflow.com/servicecalls/?servicecall=' .$servicecall->ID .'">'
  .$servicecall->ServiceCallDescription .'</a>';
    }
}else echo 'No service Calls';

}

?>
<a href="/servicecalls/?new=true">Raise New Service Call</a>
</div> <!-- Main content end-->
<?php include $_SERVER['DOCUMENT_ROOT'] .'/includes/footer.html.php'; ?>

2

আমি এই ত্রুটিটি নীলার বাইরে পেয়েছি কারণ আমার ফেসবুক লগইনটি খুব দ্রুত কাজ বন্ধ করে দিয়েছে (আমি হোস্টও বদলেছি) এবং এই ত্রুটিটি ফেলে দিয়েছি। ঠিক করা খুব সহজ

সমস্যাটি এই কোডটিতে ছিল

  $response = (new FacebookRequest(
    FacebookSession::newAppSession($this->appId, $this->appSecret),
    'GET',
    '/oauth/access_token',
    $params
  ))->execute()->getResponse(true);

  if (isset($response['access_token'])) {       <---- this line gave error
    return new FacebookSession($response['access_token']);
  }

মূলত isset () ফাংশনটি একটি অ্যারের আশা করে তবে পরিবর্তে এটি একটি বস্তু খুঁজে পায়। এর সহজ সমাধান হ'ল পিএইচপি অবজেক্টকে অ্যারেতে (অ্যারে) কোয়ানটিফায়ার ব্যবহার করে রূপান্তর করা । নিম্নলিখিতটি নির্দিষ্ট কোড।

  $response = (array) (new FacebookRequest(
    FacebookSession::newAppSession($this->appId, $this->appSecret),
    'GET',
    '/oauth/access_token',
    $params
  ))->execute()->getResponse(true);

প্রথম লাইনে অ্যারে () ব্যবহারের পরিমাণটি নোট করুন।


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