web-dev-qa-db-ja.com

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

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']$resultjson_decode()によって返されたデータを持っています

この配列内の値を読み取るにはどうすればよいですか?

480
Dail

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

$result = json_decode($data, true);
687
Jon

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

あなたはこのようなデータにアクセスすることができます:

var_dump($result->context);

もしあなたがfrom-dateのような識別子を持っているなら(ハイフンは上記のメソッドを使うときPHPエラーを引き起こすでしょう)あなたは書く必要があります:

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

あなたが配列が欲しいなら、あなたはこのようなことをすることができます:

$result = json_decode($json, true);

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

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

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

コードを以下から変更してください。

$result['context'];

に:

$result->context;
128
JiNexus

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

$my_array = json_decode($my_json, true);

詳しくは ドキュメント をご覧ください。

76
Sander Marechal

今日同じ問題を抱えて、このように解決しました:

json_decode($somestring)を呼び出すとObjectが得られ、$object->keyのようにアクセスする必要がありますが、u json_decode($somestring, true)を呼び出すと辞書が得られ、$array['key']のようにアクセスできます。

72
Alexey Lysenko

これは配列ではなく、stdClass型のオブジェクトです。

これにアクセスすることができます:

echo $oResult->context;

ここでより多くの情報: PHPのstdClassとは何ですか?

54

Phpマニュアル のように、

print_r - 変数に関する人間が読める情報を印刷する

json_decode();を使うと、戻り型としてstdClass型のオブジェクトが得られます。 print_r()の中に渡される引数は、配列か文字列のどちらかです。したがって、print_r()の中にオブジェクトを渡すことはできません。私はこれに対処する2つの方法を見つけました。

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

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

    $value = $object->key;
    

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

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

print_r()var_dump();のように、それらはvar_export();の他のオプションです。

P.S :また、json_decode();の2番目のパラメータをtrueに設定すると、オブジェクトは自動的にarray();に変換されます。
ここにいくつかの参考文献があります:
http://php.net/manual/en/function.print-r.php
http://php.net/manual/ja/function.var-dump.php
http://php.net/manual/ja/function.var-export.php

23
M.S.P

次のようにstdClassオブジェクトを配列に変換できます。

$array = (array)$stdClass;

配列へのstdClsss

7
Arnab Hore

それを$result['context']としてアクセスしようとすると、それを配列として扱います。エラーは、実際にオブジェクトを扱っていることを示しているので、$result->contextとしてアクセスする必要があります。

5
Midas Mtileni

これが関数のシグネチャです。

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

Paramがfalseの場合(デフォルト)、適切なphpタイプが返されます。 object.methodパラダイムを使ってその型の値を取得します。

Paramがtrueの時、連想配列を返します。

エラー時にはNULLを返します。

配列を通して値を取得したい場合は、assocをtrueに設定してください。

4
robert

角括弧を使用する代わりに、オブジェクト演算子を使用します。たとえば、データベースオブジェクトに基づく私の配列は、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="/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
timmac15

私の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()関数は配列を期待しますが、代わりにオブジェクトを見つけます。簡単な解決策は、 (array) quantierを使用してPHP objectをarrayに変換することです。以下は固定コードです。

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

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

2
Hammad Khan

に変更

$results->fetch_array()
0
Dan Padilla