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']
어디서 $result
데이터를 반환 했는가json_decode()
이 배열 내부의 값을 어떻게 읽을 수 있습니까?
의 두 번째 매개 변수를 사용하여 json_decode
배열을 리턴하십시오.
$result = json_decode($data, true);
이 함수 json_decode()
는 기본적으로 객체를 반환합니다.
다음과 같은 데이터에 액세스 할 수 있습니다.
var_dump($result->context);
다음과 같은 식별자가있는 경우 from-date
(위의 방법을 사용할 때 하이픈으로 인해 PHP 오류가 발생 함) 다음과 같이 작성해야합니다.
var_dump($result->{'from-date'});
배열을 원하면 다음과 같이 할 수 있습니다.
$result = json_decode($json, true);
또는 객체를 배열로 캐스트하십시오.
$result = (array) json_decode($json);
->
객체이므로 이를 사용하여 액세스해야 합니다.
다음에서 코드를 변경하십시오.
$result['context'];
에:
$result->context;
true
의 두 번째 매개 변수로 사용하십시오 json_decode
. 이것은 stdObject
인스턴스 대신 json을 연관 배열로 디코딩합니다 .
$my_array = json_decode($my_json, true);
자세한 내용 은 설명서 를 참조하십시오.
오늘 같은 문제가 다음과 같이 해결되었습니다.
전화를 걸면 json_decode($somestring)
객체가 생겨서와 같이 액세스해야 $object->key
하지만, 전화 json_decode($somestring, true)
를 걸면 사전을 가져 와서$array['key']
배열이 아니며 stdClass 유형의 객체입니다.
다음과 같이 액세스 할 수 있습니다.
echo $oResult->context;
자세한 정보는 여기에서 : PHP의 stdClass 란 무엇입니까?
Php 매뉴얼에서 말한 것처럼
print_r — 변수에 대한 사람이 읽을 수있는 정보를 인쇄합니다
를 사용할 때 json_decode();
stdClass 유형의 객체를 반환 유형으로 얻습니다. 내부로 전달되는 인수 print_r()
는 배열 또는 문자열이어야합니다. 따라서 내부에 객체를 전달할 수 없습니다 print_r()
. 나는 이것을 다루는 두 가지 방법을 발견했다.
객체를 배열로 캐스트합니다.
이것은 다음과 같이 달성 될 수 있습니다.$a = (array)$object;
Object의 키에 액세스하여
앞에서 언급했듯이json_decode();
함수 를 사용할 때 stdClass의 Object를 반환합니다.->
Operator 의 도움으로 객체의 요소에 액세스 할 수 있습니다 .$value = $object->key;
하나는 객체에 중첩 배열이있는 경우 여러 키를 사용하여 하위 요소를 추출 할 수도 있습니다.
$value = $object->key1->key2->key3...;
그들의 다른 옵션은 print_r()
물론, 같은 var_dump();
과var_export();
추신 : 당신이의 두 번째 매개 변수를 설정하는 경우 또한, 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
stdClass 객체를 다음과 같이 배열로 변환 할 수 있습니다.
$array = (array)$stdClass;
로 액세스하려고 $result['context']
하면 배열로 취급 할 때 실제로 객체를 처리하고 있다는 오류가 발생하면 다음과 같이 액세스해야합니다.$result->context
함수 서명은 다음과 같습니다.
mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )
param이 false 인 경우 (기본값) 적절한 PHP 유형을 반환합니다. object.method 패러다임을 사용하여 해당 유형의 값을 가져옵니다.
param이 true이면 연관 배열을 반환합니다.
오류가 발생하면 NULL을 반환합니다.
배열을 통해 값을 가져 오려면 assoc을 true로 설정하십시오.
대괄호를 사용하는 대신 객체 연산자를 사용하십시오. 예를 들어 데이터베이스 객체를 기반으로 한 내 배열은 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'; ?>
페이스 북 로그인이 갑자기 작동을 멈 췄고 (호스트도 변경 했음)이 오류가 발생했기 때문에이 오류가 파란색으로 표시되지 않았습니다. 수정은 정말 쉽습니다
이 코드에 문제가있었습니다
$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);
첫 번째 행에서 off array () 한정자를 사용하십시오.
에 대한 변경
$results->fetch_array()
json 문자열의 결과로 배열을 얻으려면 두 번째 매개 변수를 부울 true로 설정해야합니다.
$result = json_decode($json_string, true);
$context = $result['context'];
그렇지 않으면 $ result는 표준 개체가됩니다. 그러나 객체로 값에 액세스 할 수 있습니다.
$result = json_decode($json_string);
$context = $result->context;
참고 URL : https://stackoverflow.com/questions/6815520/cannot-use-object-of-type-stdclass-as-array
'development' 카테고리의 다른 글
Eclipse에서 강조 표시 범위 지우기 (0) | 2020.02.13 |
---|---|
CSS 강제 이미지 크기 조정 및 가로 세로 비율 유지 (0) | 2020.02.13 |
객체의 클래스를 결정하는 방법? (0) | 2020.02.13 |
텍스트 정렬 중심을 사용하는 중심 이미지? (0) | 2020.02.13 |
파이프로“티”를 사용하는 동안 파일에 stderr를 쓰려면 어떻게해야합니까? (0) | 2020.02.12 |