코드를 배열을 사용하여 작성하는 동안 객체에 저장된 데이터로 작동하는 API를 웹 사이트에 통합하고 있습니다.
객체를 배열로 변환하는 빠르고 더러운 기능을 원합니다.
답변
그냥 캐스트
$array = (array) $yourObject;
에서 배열 :
객체가 배열로 변환되면 결과는 요소가 객체의 속성 인 배열입니다. 키는 몇 가지 예외를 제외하고 멤버 변수 이름입니다. 정수 특성에 액세스 할 수 없습니다. 개인 변수는 클래스 이름 앞에 변수 이름이 붙습니다. 보호 된 변수는 변수 이름 앞에 ‘*’가 붙습니다. 이 앞에 붙은 값은 양쪽에 널 바이트가 있습니다.
예 : 단순 객체
$object = new StdClass;
$object->foo = 1;
$object->bar = 2;
var_dump( (array) $object );
산출:
array(2) {
'foo' => int(1)
'bar' => int(2)
}
예 : 복합 객체
class Foo
{
private $foo;
protected $bar;
public $baz;
public function __construct()
{
$this->foo = 1;
$this->bar = 2;
$this->baz = new StdClass;
}
}
var_dump( (array) new Foo );
출력 (명확성을 위해 편집 된 \ 0) :
array(3) {
'\0Foo\0foo' => int(1)
'\0*\0bar' => int(2)
'baz' => class stdClass#2 (0) {}
}
var_export
대신에 출력 var_dump
:
array (
'' . "\0" . 'Foo' . "\0" . 'foo' => 1,
'' . "\0" . '*' . "\0" . 'bar' => 2,
'baz' =>
stdClass::__set_state(array(
)),
)
이 방법으로 타입 캐스팅을 수행하면 객체 그래프를 딥 캐스팅하지 않으며 (공개 견적에 설명 된대로) 널 바이트를 적용하여 비공개 속성에 액세스해야합니다. 따라서 이것은 StdClass 객체 또는 공용 속성 만있는 객체를 캐스팅 할 때 가장 효과적입니다. 빠르고 더러운 (요청 한 것) 괜찮습니다.
이 심층 블로그 게시물도 참조하십시오.
답변
JSON 인코딩 / 디코딩 함수의 동작에 의존하여 깊이 중첩 된 객체를 연관 배열로 빠르게 변환 할 수 있습니다.
$array = json_decode(json_encode($nested_object), true);
답변
” PHP 오브젝트에 대한 첫 번째 Google 히트 에서 assoc 배열 “에 이르기까지
function object_to_array($data)
{
if (is_array($data) || is_object($data))
{
$result = array();
foreach ($data as $key => $value)
{
$result[$key] = object_to_array($value);
}
return $result;
}
return $data;
}
소스는 codesnippets.joyent.com에 있습니다.
답변
객체 속성이 공개 인 경우 다음을 수행 할 수 있습니다.
$array = (array) $object;
개인용이거나 보호 된 경우 어레이에 이상한 키 이름이 있습니다. 따라서이 경우 다음 기능이 필요합니다.
function dismount($object) {
$reflectionClass = new ReflectionClass(get_class($object));
$array = array();
foreach ($reflectionClass->getProperties() as $property) {
$property->setAccessible(true);
$array[$property->getName()] = $property->getValue($object);
$property->setAccessible(false);
}
return $array;
}
답변
class Test{
const A = 1;
public $b = 'two';
private $c = test::A;
public function __toArray(){
return call_user_func('get_object_vars', $this);
}
}
$my_test = new Test();
var_dump((array)$my_test);
var_dump($my_test->__toArray());
산출
array(2) {
["b"]=>
string(3) "two"
["Testc"]=>
int(1)
}
array(1) {
["b"]=>
string(3) "two"
}
답변
다음은 몇 가지 코드입니다.
function object_to_array($data) {
if ((! is_array($data)) and (! is_object($data)))
return 'xxx'; // $data;
$result = array();
$data = (array) $data;
foreach ($data as $key => $value) {
if (is_object($value))
$value = (array) $value;
if (is_array($value))
$result[$key] = object_to_array($value);
else
$result[$key] = $value;
}
return $result;
}
답변
여기에 게시 된 다른 모든 답변은 공용 속성으로 만 작동합니다. 리플렉션과 게터를 사용하여 JavaBeans 와 같은 객체 와 함께 작동하는 솔루션은 다음과 같습니다 .
function entity2array($entity, $recursionDepth = 2) {
$result = array();
$class = new ReflectionClass(get_class($entity));
foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
$methodName = $method->name;
if (strpos($methodName, "get") === 0 && strlen($methodName) > 3) {
$propertyName = lcfirst(substr($methodName, 3));
$value = $method->invoke($entity);
if (is_object($value)) {
if ($recursionDepth > 0) {
$result[$propertyName] = $this->entity2array($value, $recursionDepth - 1);
}
else {
$result[$propertyName] = "***"; // Stop recursion
}
}
else {
$result[$propertyName] = $value;
}
}
}
return $result;
}