タイプstdClassのオブジェクトを配列として使用できませんか?


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
$ result = json_decode( '文字列'、true); trueを追加すると、結果がstdClassではなく配列として返されます。
ネパール2016

回答:


790

の2番目のパラメーターを使用してjson_decode、配列を返すようにします。

$result = json_decode($data, true);

209

この関数json_decode()はデフォルトでオブジェクトを返します。

次のようなデータにアクセスできます。

var_dump($result->context);

次のような識別子がある場合from-date(ハイフンは上記のメソッドを使用するとPHPエラーを引き起こす)、次のように記述する必要があります。

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

配列が必要な場合は、次のようにすることができます。

$result = json_decode($json, true);

または、オブジェクトを配列にキャストします。

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

2
knockoutjsによって設定されたphpの_destroy値を参照する方法を見つけようとしたとき、これを見つけるのにしばらく時間がかかりました。+ 1
deltree

2
この回答は、最初の(最も評価された)回答よりもはるかに適格です!
Mojtaba Rezaeian 2018

149

->オブジェクトなので、を使用してアクセスする必要があります。

コードを次のように変更します。

$result['context'];

に:

$result->context;

私が抱えている問題は、プロパティを条件付きで使用しようとすることです。if ($result->context = $var) これにより、プロパティがvarに設定され、trueが返されます。
STWilson、2016年

3
@STWilsonでは、二重のイコールを使用する必要があり==ます。現在の状態では、単一のイコールを使用して$var値を割り当てています。そして、はそれが空であるかどうかのようにそれを読み取り、が値を持つ場合、それはそれが空ではなく常にtrueを返すことを意味します。$result->context=if statement$var
JiNexus 2016年

89

今日同じ問題があり、次のように解決しました:

あなたが呼び出すjson_decode($somestring)場合はオブジェクトを取得し、のようにアクセスする必要があります$object->keyが、uを呼び出すjson_decode($somestring, true)場合は辞書を取得し、次のようにアクセスできます$array['key']


2
これで私はとても時間を節約できました!私は本当のパラメータを入れず、配列としてアクセスしようとしました
Meeyam

87

trueの2番目のパラメータとして使用しますjson_decode。これにより、jsonがstdObjectインスタンスではなく連想配列にデコードされます。

$my_array = json_decode($my_json, true);

詳細については、ドキュメントを参照しください。



28

PHPのマニュアルたとえば、

print_r —変数に関する人間が読める情報を出力します

を使用するとjson_decode();、戻り値の型としてstdClass型のオブジェクトを取得します。内部で渡される引数はprint_r()、配列または文字列でなければなりません。したがって、内でオブジェクトを渡すことはできませんprint_r()。これに対処する2つの方法を見つけました。

  1. オブジェクトを配列にキャストします。
    これは次のようにして実現できます。

    $a = (array)$object;
  2. オブジェクトのキーにアクセスする方法
    前述のように、json_decode();関数を使用すると、stdClassのオブジェクトが返されます。あなたはの助けを借りてオブジェクトの要素にアクセスすることができます->Operator。

    $value = $object->key;

1つは、オブジェクトにネストされた配列がある場合、複数のキーを使用してサブ要素を抽出することもできます。

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

彼らは他のオプションです print_r()としても、同様var_dump();var_export();

PSは:あなたがの2番目のパラメータを設定した場合も、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

json文字列から結果として配列を取得するには、2番目のパラメーターをブール値trueに設定する必要があります。

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

それ以外の場合、$ resultはstdオブジェクトになります。ただし、オブジェクトとして値にアクセスできます。

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

paramがfalse(デフォルト)の場合、適切なphpタイプを返します。その型の値は、object.methodパラダイムを使用してフェッチします。

paramがtrueの場合、連想配列を返します。

エラーの場合はNULLを返します。

配列を介して値をフェッチする場合は、assocをtrueに設定します。


3

APIを使用するときに、オブジェクトをオブジェクトのままにしたい場合があります。ネストされたオブジェクトを持つオブジェクトにアクセスするには、次のようにします。

オブジェクトをprint_rすると、次のように表示されると想定します。

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

予想される出力は、改行付きの「Robert」になります。

オブジェクトの一部を別のオブジェクトに再割り当てすることもできます。

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

予想される出力は、改行付きの「Robert」になります。

次のキー「1」にアクセスするためのプロセスは同じです。

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

予想される出力は「USA」になります

うまくいけば、これがオブジェクトの理解に役立ち、オブジェクトをオブジェクトのままにする理由を理解できるでしょう。プロパティにアクセスするためにオブジェクトを配列に変換する必要はありません。


2

かっこを使用する代わりにオブジェクト演算子を使用します。たとえば、データベースオブジェクトに基づく私の配列は、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;
}

}

コントローラスクリプトでこのコードを使用して情報にアクセスするには:

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



?>

次に、servicecallsが設定されており、カウントが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

Facebookのログインが突然機能しなくなり(ホストも変更したため)、このエラーがスローされたため、このエラーは突然発生しました。修正は本当に簡単です

問題はこのコードにありました

  $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()関数は配列を期待しますが、代わりにオブジェクトを見つけます。単純な解決策は、(配列)数量詞を使用してPHPオブジェクトを配列に変換することです。以下は修正されたコードです。

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

最初の行でのarray()数量詞の使用に注意してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.