2014-03-27 3 views
0

PHP 객체를 재귀 적으로 배열로 변환하려고합니다. 필자가 작성한 함수는 다음과 같습니다.PHP는 재귀 적으로 객체를 배열로 변환합니다.

public function object_to_array($obj) { 
    $array = (array) $obj; 
    foreach ($array as $attribute) { 
     if (is_array($attribute)) $attribute = $this->object_to_array($attribute); 
     if (!is_string($attribute)) $attribute = (array) $attribute; 
    } 
    return $array; 
} 

그러나 여전히 외부 배열에 개체가 있습니다. 왜 이런거야? 내 기능이 올바르지 않습니까?

+2

코드에서 아무 것도 수정하지 않습니다 – zerkms

답변

2

당신은 확인하려면 :

if (is_object($attribute) || is_array($attribute)) $attribute = $this->object_to_array($attribute); 
//I don't see a need for this 
//if (!is_string($attribute)) $attribute = (array) $attribute; 

그리고 아지즈 살레에서 참조 $attribute 그래서 당신은 그것을 수정할 수 있습니다

foreach ($array as &$attribute) { 
+0

두 번째 부분은 궁극적으로 json으로 바꾸기 때문입니다. 문자열이라면 더 이상 분리 할 필요가 없습니다. – 735Tesla

+0

문자열이 아니라면 (배열) 배열로 캐스팅하고 있습니다. int, float, boolean은 배열이됩니다. – AbraCadaver

+0

문자열이 아닌 경우 배열로 캐스팅한다고 말하고 있다고 생각했습니다. '! '는 조건을 뒤집지 않습니까? – 735Tesla

0

ArrayObject로 작성된 PHP를 사용해보십시오. 객체를 배열로 취급 할 수 있습니다. 이것은 당신이 참조를 사용하고 있기 때문에 속성 변경 사항을 유지합니다

foreach ($array as &$attribute) { 

:

http://www.php.net/manual/en/class.arrayobject.php

0

당신은 할 필요가있다.

또는 :

foreach ($array as $sub => $attribute) { 
    if (is_array($attribute)) $array[$sub] = $this->object_to_array($attribute); 
    if (!is_string($attribute)) $array[$sub] = (array) $attribute; 
} 

이 직접 배열 하위 요소를 수정합니다. 나는 보통 나에게 더 고급 스럽기 때문에 두 번째 해결책을 찾으러 간다. 둘 다 할 수 있지만은, 객체가 아닌 배열의 경우

0

에게 당신을 당신이 is_object를 검사해야 할 때 is_array를 검사하고있다. 이미 배열이라면, 아마도 그 함수를 재귀 할 필요가 없을 것이다. 두 개체를 모두 확인할 수 있으므로 개체 배열도 변환됩니다.

관련 문제