PHP 7.2 용으로 업데이트 됨
PHP 7.2는 객체 및 배열 캐스트의 숫자 키 변환에 대한 동작 변경을 도입하여 이러한 특정 불일치를 수정하고 다음 예제가 모두 예상대로 동작하도록합니다.
혼란 스러울 것이 하나 줄었습니다!
원래 답변 (7.2.0 이전 버전에 적용)
PHP는 당신이 실제로 자신을 찾고 싶지 않은 어두운 골목을 가지고 있습니다 . 이름이 숫자 인 개체 속성도 그중 하나입니다.
그들이 당신에게 말하지 않은 것
사실 # 1 : 유효한 변수 이름이 아닌 이름의 속성에 쉽게 액세스 할 수 없습니다.
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo;
사실 # 2 : 중괄호 구문으로 이러한 속성에 액세스 할 수 있습니다 .
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
사실 # 3 : 그러나 속성 이름이 모두 숫자이면 아닙니다 !
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
echo $o->{'123'};
라이브 예 .
사실 # 4 : 객체가 처음에 배열에서 나온 것이 아니라면.
$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123';
echo $o1->{'123'};
echo $o2->{'123'};
라이브 예 .
매우 직관적이지 않습니까?
할 수있는 일
옵션 # 1 : 수동으로 수행
가장 실용적인 접근 방식은 관심있는 객체를 배열로 다시 캐스팅하는 것입니다. 그러면 속성에 액세스 할 수 있습니다.
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'};
echo $a['123'];
불행히도 이것은 재귀 적으로 작동하지 않습니다. 따라서 귀하의 경우에는 다음과 같은 작업을 수행해야합니다.
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0'];
옵션 # 2 : 핵 옵션
대안은 객체를 배열로 재귀 적으로 변환하는 함수를 작성하는 것입니다.
function recursive_cast_to_array($o) {
$a = (array)$o;
foreach ($a as &$value) {
if (is_object($value)) {
$value = recursive_cast_to_array($value);
}
}
return $a;
}
$arr = recursive_cast_to_array($myVar);
$value = $arr['highlighting']['448364']['Data']['0'];
그러나 나는 이것이 당신이 관심을 갖지 않는 모든 속성과 당신이 관심을 갖지 않는 모든 속성을 불필요하게 배열로 캐스팅 할 것이기 때문에 이것이 전반적으로 더 나은 옵션이라고 확신 하지 못합니다 .
옵션 # 3 : 현명하게 플레이
이전 옵션의 대안은 기본 제공 JSON 함수를 사용하는 것입니다.
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
JSON 함수는 외부 함수를 정의 할 필요없이 배열로의 재귀 변환을 유용하게 수행합니다. 그러나 이것이 바람직해 보이지만 옵션 # 2의 "nuke"단점 과 추가로 객체 내부에 문자열이있는 경우 해당 문자열 이 UTF-8로 인코딩 되어야 한다는 단점이 있습니다 (이는의 요구 사항입니다 json_encode
).