2011-07-25 8 views
359

Me sale un error extraño al usar json_decode(). Se decodificar correctamente los datos (lo vi usando print_r), pero cuando intento acceder a la información en el interior de la matriz que consigo:¿No se puede usar el objeto del tipo stdClass como matriz?

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

sólo trataron de hacer: $result['context'] donde $result se encuentran los datos devueltos por json_decode()

¿Cómo puedo leer valores dentro de esta matriz?

+8

$ result = json_decode ('the string', true); Agregar el verdadero devuelve el resultado como una matriz y no una stdClass. – Nepaluz

Respuesta

41

No es una matriz, es un objeto del tipo stdClass.

Puede acceder a él de esta manera:

echo $oResult->context; 

Más información aquí: What is stdClass in PHP?

61

Uso true como segundo parámetro a json_decode. Esto decodificar el JSON en una matriz asociativa en lugar de stdObject casos:

$my_array = json_decode($my_json, true); 

Ver the documentation para más detalles.

565

usar el segundo parámetro de json_decode para que sea devolver una matriz:

$result = json_decode($data, true); 
163

La función json_decode() devuelve un objeto de forma predeterminada.

Puede acceder a los datos de la siguiente manera:

var_dump($result->context); 

Si tiene identificadores como from-date (el guión podría causar un error de PHP cuando se utiliza el método anterior) que tiene que escribir:

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

Si desea una matriz que puede hacer algo como esto:

$result = json_decode($json, true); 

O r convertir el objeto a una matriz:

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

me llevó un tiempo encontrar esto cuando trato de encontrar una manera de referirme al valor _destroy en php establecido por knockoutjs, así que +1 – deltree

2

en lugar de utilizar los soportes utilizan el operador de objeto, por ejemplo, mi matriz basada en el objeto de base de datos se crea como esto en una clase llamada 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; 
} 

} 

a acceder a la información que utilizo este código en el script del controlador:

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



?> 

a continuación para mostrar la información puedo comprobar para ver si servicecalls se ha establecido y tiene un recuento mayor que 0 rememb er no es una matriz estoy hacen referencia a lo que acceder a los registros con el operador objeto "->" como esto:

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

Debe acceder a él mediante -> desde su objeto.

cambiar su código de:

$result['context']; 

Para:

$result->context; 
+0

El problema que tengo es tratar de usar la propiedad en un 'condicional' ($ result- > context = $ var) 'Esto hace que la propiedad se establezca en var y devuelve true, no importa. – STWilson

+1

@STWilson debe usar un doble igual a '==', en su estado actual está asignando el valor '$ var' a' $ result-> context' utilizando un solo igual '='. Y el 'if statement' lo leerá como si estuviera vacío o no, y si el' $ var' tiene valor, entonces eso significa que no está vacío y siempre devolverá true. – Jimvirle

+0

¡Gracias! Esto debe marcarse como la respuesta correcta ... – Roberto

6

Puede convertir objeto stdClass a la matriz como:

$array = (array)$stdClass; 

stdClsss to array

4

Aquí es el f firma de la unción:

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

Cuando param es falso, que es el predeterminado, devolverá un tipo de php apropiado. Obtienes el valor de ese tipo usando el paradigma object.method.

Cuando param es verdadero, devolverá matrices asociativas.

Devolverá NULL en caso de error.

Si desea obtener valor a través de una matriz, establezca assoc en verdadero.

31

tener el mismo problema hoy en día, resuelto de esta manera:

Si llama json_decode($somestring) obtendrá un objeto y necesita acceder como $object->key, pero si te llaman json_decode($somestring, true) obtendrá un diccionario y se puede acceder como $array['key']

18

a medida que el Manual PHP decir,

print_r - Imprime información legible para humanos sobre una variable

Cuando usamos json_decode();, obtenemos un objeto del tipo stdClass como tipo de retorno. Los argumentos, que deben pasarse dentro de print_r(), deben ser una matriz o una cadena. Por lo tanto, no podemos pasar un objeto dentro de print_r(). Encontré 2 maneras de lidiar con esto.

  1. Ejecuta el objeto a la matriz.
    Esto se puede lograr de la siguiente manera.

    $a = (array)$object; 
    
  2. Al acceder a la clave del objeto
    Como se mencionó anteriormente, cuando se utiliza la función json_decode();, devuelve un objeto de stdClass. puede acceder a los elementos del objeto con la ayuda del operador ->.

    $value = $object->key; 
    

Uno, también se puede utilizar varias claves para extraer los elementos de sub encajona si el objeto ha anidado arrays.

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

Su son otras opciones a print_r() también, como var_dump(); y var_export();

PS: Además, si se establece el segundo parámetro de la json_decode(); a true, éste se convertirá automáticamente el objeto a una array();
Estas son algunas referencias:
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

4

Al intentar acceder a él como $result['context'], que tratarla como una matriz, el error que te está diciendo que en realidad se trata de un objeto, entonces usted debe acceder a él como $result->context

0

cambiarlo por

$results->fetch_array() 
2

tengo este error de la nada porque mi facebook login suddently dejó de funcionar (yo también había cambiado anfitriones) y throwed este error. La solución es muy fácil

La cuestión estaba en el código

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

Básicamente isset() espera una matriz, pero en vez de eso se encontró un objeto. La solución simple es convertir el objeto PHP a una matriz usando (matriz) cuantificador. El siguiente es el código fijo.

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

Nota el cuantificador uso fuera array() en primera línea.

Cuestiones relacionadas