Dizi olarak stdClass türündeki nesne kullanılamaz mı?


541

Kullanarak garip bir hata alıyorum json_decode(). (Ben kullanarak gördüm print_r) doğru veri kodunu çözmek , ama ben dizi içindeki bilgiye erişmeye çalıştığınızda olsun:

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

: Ben sadece yapmaya çalıştığım $result['context']yere $resulttarafından döndürülen veri varjson_decode()

Bu dizinin içindeki değerleri nasıl okuyabilirim?


15
$ sonuç = json_decode ('dize', doğru); True değerinin eklenmesi sonucu stdClass yerine bir dizi olarak döndürür.
Nepaluz

Yanıtlar:


789

json_decodeBir dizi döndürmesi için ikinci parametresini kullanın :

$result = json_decode($data, true);

209

İşlev json_decode()varsayılan olarak bir nesne döndürür.

Aşağıdaki gibi verilere erişebilirsiniz:

var_dump($result->context);

from-date(Yukarıdaki yöntemi kullanırken tire işareti bir PHP hatasına neden olur) gibi tanımlayıcılarınız varsa şunları yazmanız gerekir:

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

Bir dizi istiyorsanız böyle bir şey yapabilirsiniz:

$result = json_decode($json, true);

Veya nesneyi bir diziye yayınlayın:

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

2
knockoutjs tarafından belirlenen php _destroy değerine başvurmak için bir yol bulmaya çalışırken bunu bulmak için biraz zaman aldı, bu yüzden +1
deltree

2
Bu cevap ilk (en çok puan alan) cevaptan çok daha nitelikli!
Mojtaba Rezaeian

149

Sen kullanarak erişmek gerekir ->onun bir nesne beri.

Kodunuzu şununla değiştirin:

$result['context'];

Kime:

$result->context;

Sahip olduğum sorun bir koşullu özelliği kullanmaya çalışıyor if ($result->context = $var) Bu özellik var ayarlanmış neden olur ve olursa olsun, true döndürür.
STWilson

3
@STWilson ==, bir çift eşit kullanmalısınız , mevcut durumunuzda tek bir eşit kullanarak $vardeğer atarsınız . Ve boş olarak ya da boşmuş gibi okuyacak ve eğer değeri varsa boş olmadığı ve her zaman doğru olacağı anlamına gelir. $result->context=if statement$var
JiNexus

89

Bugün aynı problemi yaşayın, şu şekilde çözüldü:

Aradığınızda json_decode($somestring)bir Nesne alırsınız ve gibi erişmeniz gerekir $object->key, ancak u ararsanız json_decode($somestring, true)bir sözlük alırsınız ve$array['key']


2
Bu bana çok zaman kazandırdı! Gerçek parametreyi
koymuyordum

87

İçin trueikinci parametre olarak kullanın json_decode. Bu, json'u stdObjectörnekler yerine ilişkilendirilebilir bir diziye deşifre eder :

$my_array = json_decode($my_json, true);

Daha fazla ayrıntı için belgelere bakın.



28

As Php Manuel söz hakkından,

print_r - Bir değişken hakkında okunabilir bilgiler yazdırır

Kullandığımızda json_decode();, dönüş türü olarak stdClass türünde bir nesne alırız. İçinden geçirilecek argümanlar print_r()bir dizi veya dize olmalıdır. Dolayısıyla, içine bir nesne geçiremeyiz print_r(). Bununla başa çıkmanın 2 yolunu buldum.

  1. Nesneyi diziye yayınlayın.
    Bu, aşağıdaki gibi gerçekleştirilebilir.

    $a = (array)$object;

  2. Daha önce de belirtildiği gibi, json_decode();işlevi kullandığınızda Nesne anahtarına erişerek, stdClass Nesnesi döndürür. nesnenin elemanlarına ->Operatör yardımı ile erişebilirsiniz .

    $value = $object->key;

Bir, nesne iç içe diziler varsa alt öğeleri ayıklamak için birden çok anahtar kullanabilirsiniz.

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

Onların diğer seçenekler print_r()de, benzeri var_dump();vevar_export();

PS : Eğer ikinci parametre ayarlarsanız Ayrıca json_decode();etmek true, otomatik olarak bir nesneyi dönüştürür array();
İşte bazı referanslar şunlardır:
http://php.net/manual/en/function.print-r.php
http: // php.net/manual/tr/function.var-dump.php
http://php.net/manual/en/function.var-export.php


12

Bir diziyi bir json dizesinden almak için ikinci parametreyi boolean true olarak ayarlamanız gerekir.

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

Aksi takdirde $ sonucu bir std nesnesi olacaktır. ancak değerlere nesne olarak erişebilirsiniz.

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


8

Ona $result['context']bir dizi olarak davranmaya çalıştığınızda, bir nesne olarak ele alıyorsanız, size bir nesneyle gerçekten uğraştığınızı söyleyen hata, o zaman ona$result->context


4

İşlev imzası:

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

Param false olduğunda, bu varsayılan değer olarak, uygun bir php türü döndürür. Bu türün değerini object.method paradigmasını kullanarak alırsınız.

Param doğru olduğunda, ilişkilendirilebilir diziler döndürür.

Hata durumunda NULL döndürecektir.

Dizi aracılığıyla değer almak istiyorsanız, assoc öğesini true olarak ayarlayın.


3

Bazen API ile çalışırken bir nesneyi bir nesne olarak tutmak istersiniz. İç içe nesneler içeren nesneye erişmek için aşağıdakileri yapabilirsiniz:

Nesneyi yazdırdığınızda bunu görebileceğinizi varsayacağız:

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

Nesnenin ilk kısmına erişmek için:

print $response->{'status'};

Ve bu "başarı"

Şimdi diğer kısımları anahtarlayalım:

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

Beklenen çıktı satır sonu ile "Robert" olacaktır.

Ayrıca nesnenin bir kısmını başka bir nesneye yeniden atayabilirsiniz.

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

Beklenen çıktı satır sonu ile "Robert" olacaktır.

Bir sonraki "1" anahtarına erişmek için işlem aynıdır.

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

Beklenen çıktı "ABD"

Umarım bu nesneleri anlamanıza ve neden bir nesneyi bir nesne tutmak istediğimize yardımcı olur. Özelliklerine erişmek için bir nesneyi diziye dönüştürmeniz gerekmez.


2

köşeli ayraç kullanmak yerine nesne işleci kullanın, örneğin veritabanı nesnesine dayalı benim dizi DB adlı bir sınıfta şöyle oluşturulur:

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

}

denetleyici komut dosyasında bu kodu kullandığım bilgilere erişmek için:

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



?>

daha sonra servicecalls ayarlanmış olup olmadığını görmek için kontrol bilgileri görüntülemek için 0 ve daha büyük bir sayım hatırlıyorum ben bir nesne olmadığını hatırlıyorum bu yüzden nesne operatörü ile kayıtlara erişmek - "" şöyle:

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

Çünkü facebook giriş aniden çalışmayı durdurdu (ben de ana bilgisayarlar değiştirmişti) ve bu hatayı attı çünkü bu hatayı mavi çıktı. Düzeltmek gerçekten kolay

Sorun bu koddaydı

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

Temel olarak isset () işlevi bir dizi bekler, bunun yerine bir nesne bulur. Basit çözüm, PHP nesnesini (dizi) nicelik belirteci kullanarak diziye dönüştürmektir . Sabit kod aşağıdadır.

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

İlk satırda off-off () kullanım niceliğini not edin.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.