Tidak dapat menggunakan objek tipe stdClass sebagai array?

541

Saya mendapatkan kesalahan aneh menggunakan json_decode(). Ini memecahkan kode dengan benar data (saya melihatnya menggunakan print_r), tetapi ketika saya mencoba mengakses informasi di dalam array saya mendapatkan:

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

Saya hanya mencoba melakukan: di $result['context']mana $resultdata dikembalikan olehjson_decode()

Bagaimana saya bisa membaca nilai di dalam array ini?

Dail
sumber
15
$ result = json_decode ('the string', true); Menambahkan true mengembalikan hasilnya sebagai array dan bukan stdClass.
Nepaluz

Jawaban:

790

Gunakan parameter kedua json_decodeuntuk membuatnya mengembalikan array:

$result = json_decode($data, true);
Jon
sumber
209

Fungsi json_decode()mengembalikan objek secara default.

Anda dapat mengakses data seperti ini:

var_dump($result->context);

Jika Anda memiliki pengidentifikasi seperti from-date(tanda hubung akan menyebabkan kesalahan PHP saat menggunakan metode di atas) Anda harus menulis:

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

Jika Anda menginginkan array, Anda dapat melakukan sesuatu seperti ini:

$result = json_decode($json, true);

Atau melemparkan objek ke array:

$result = (array) json_decode($json);
svens
sumber
2
Butuh waktu beberapa saat untuk menemukan ini ketika mencoba menemukan cara untuk merujuk ke nilai _destroy di php yang ditetapkan oleh knockoutjs, jadi +1
deltree
2
Jawaban ini jauh lebih berkualitas daripada jawaban pertama (paling banyak dinilai)!
Mojtaba Rezaeian
149

Anda harus mengaksesnya menggunakan ->karena merupakan objek.

Ubah kode Anda dari:

$result['context'];

Untuk:

$result->context;
JiNexus
sumber
Masalah yang saya miliki adalah mencoba menggunakan properti dalam kondisi. if ($result->context = $var) Hal ini menyebabkan properti diatur ke var dan mengembalikan true, tidak masalah.
STWilson
3
@ STWilson Anda harus menggunakan ganda sama dengan ==, dalam keadaan Anda saat ini Anda menetapkan $varnilai $result->contextdengan menggunakan satu sama dengan =. Dan if statementakan membacanya seolah-olah kosong atau tidak, dan jika $varmemiliki nilai maka itu berarti tidak kosong dan akan selalu mengembalikan true.
JiNexus
89

Punya masalah yang sama hari ini, diselesaikan seperti ini:

Jika Anda menelepon, json_decode($somestring)Anda akan mendapatkan Object dan Anda perlu mengakses like $object->key, tetapi jika u call json_decode($somestring, true)Anda akan mendapatkan kamus dan dapat mengakses like$array['key']

Alexey Lysenko
sumber
2
Ini menghemat banyak waktu! Saya tidak memasukkan parameter sebenarnya, dan mencoba mengaksesnya sebagai sebuah array
Meeyam
87

Gunakan truesebagai parameter kedua json_decode. Ini akan mendekode json ke dalam array asosiatif alih-alih stdObjectinstance:

$my_array = json_decode($my_json, true);

Lihat dokumentasi untuk lebih jelasnya.

Sander Marechal
sumber
61

Ini bukan array, ini objek tipe stdClass.

Anda dapat mengaksesnya seperti ini:

echo $oResult->context;

Info lebih lanjut di sini: Apa itu stdClass di PHP?

Wesley van Opdorp
sumber
28

Seperti Manual Php katakan,

print_r - Mencetak informasi yang dapat dibaca manusia tentang suatu variabel

Ketika kami menggunakan json_decode();, kami mendapatkan objek tipe stdClass sebagai tipe kembali. Argumen, yang harus dilewatkan di dalam print_r()harus berupa array atau string. Karenanya, kita tidak dapat melewatkan objek di dalamnya print_r(). Saya menemukan 2 cara untuk mengatasi ini.

  1. Keluarkan objek ke array.
    Ini bisa dicapai sebagai berikut.

    $a = (array)$object;
  2. Dengan mengakses kunci Objek
    Seperti yang disebutkan sebelumnya, ketika Anda menggunakan json_decode();fungsi, ia mengembalikan Objek stdClass. Anda dapat mengakses elemen-elemen objek dengan bantuan ->Operator.

    $value = $object->key;

Satu, juga dapat menggunakan beberapa kunci untuk mengekstrak sub elemen memetikan jika objek memiliki array bersarang.

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

Mereka adalah pilihan lain print_r()juga, seperti var_dump();danvar_export();

PS : Juga, Jika Anda mengatur parameter kedua json_decode();untuk true, itu akan secara otomatis mengkonversi objek ke array();
Berikut adalah beberapa referensi:
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

Panda
sumber
12

Untuk mendapatkan array sebagai hasil dari string json, Anda harus menetapkan param kedua sebagai boolean true.

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

Kalau tidak, $ result akan menjadi objek std. tetapi Anda dapat mengakses nilai sebagai objek.

  $result = json_decode($json_string);
 $context = $result->context;
infomasud
sumber
8

Anda dapat mengonversi objek stdClass ke array seperti:

$array = (array)$stdClass;

stdClsss ke array

Arnab
sumber
8

Ketika Anda mencoba mengaksesnya sebagai $result['context'], Anda memperlakukannya sebagai array, kesalahan itu memberitahu Anda bahwa Anda benar-benar berurusan dengan suatu objek, maka Anda harus mengaksesnya sebagai$result->context

Midas Mtileni
sumber
4

Inilah tanda tangan fungsinya:

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

Ketika param salah, yang merupakan default, itu akan mengembalikan tipe php yang sesuai. Anda mengambil nilai tipe itu menggunakan paradigma object.method.

Ketika param benar, itu akan mengembalikan array asosiatif.

Ini akan mengembalikan NULL pada kesalahan.

Jika Anda ingin mengambil nilai melalui array, setel assoc ke true.

robert
sumber
3

Terkadang saat bekerja dengan API Anda hanya ingin menyimpan objek sebagai objek. Untuk mengakses objek yang memiliki objek bersarang Anda dapat melakukan hal berikut:

Kami akan menganggap ketika Anda mencetak objek yang mungkin Anda lihat:

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

Untuk mengakses bagian pertama dari objek:

print $response->{'status'};

Dan itu akan menghasilkan "kesuksesan"

Sekarang, mari kunci bagian lain:

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

Output yang diharapkan adalah "Robert" dengan jeda baris.

Anda juga dapat menetapkan ulang bagian dari objek ke objek lain.

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

Output yang diharapkan adalah "Robert" dengan jeda baris.

Untuk mengakses kunci "1" selanjutnya prosesnya sama.

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

Output yang diharapkan adalah "AS"

Semoga ini akan membantu Anda memahami objek dan mengapa kami ingin menjaga objek objek. Anda seharusnya tidak perlu mengonversi objek ke array untuk mengakses propertinya.

Robert Saylor
sumber
2

alih-alih menggunakan tanda kurung menggunakan operator objek misalnya array saya berdasarkan objek database dibuat seperti ini di kelas yang disebut DB:

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

}

untuk mengakses informasi saya menggunakan kode ini pada skrip controller:

<?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';



?>

kemudian untuk menampilkan informasi yang saya periksa untuk melihat apakah servicecalls telah diatur dan memiliki hitungan lebih besar dari 0 ingat itu bukan array yang saya rujuk jadi saya mengakses catatan dengan operator objek "->" seperti ini:

<?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'; ?>
timmac15
sumber
2

Saya mendapatkan kesalahan ini karena login facebook saya tiba-tiba berhenti bekerja (saya juga telah mengubah host) dan melempar kesalahan ini. Cara mengatasinya sangat mudah

Masalahnya ada di kode ini

  $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']);
  }

Pada dasarnya fungsi isset () mengharapkan array tetapi malah menemukan objek. Solusi sederhana adalah mengkonversi objek PHP ke array menggunakan (array) quantifier. Berikut ini adalah kode tetap.

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

Perhatikan penggunaan array () quantifier di baris pertama.

Hammad Khan
sumber
1

Ubah untuk

$results->fetch_array()
Dan Padilla
sumber