2013-03-27 6 views
0

새로운 객체가 배열에 없을 때 배열에 푸시해야합니다. 그러나 나는이 오류를 계속 받는다. 루프에서 새 객체를 만들거나 루프에서 배열에 항목을 푸는 경우이 문제가 자주 발생합니다. 개체를 다시 사용하려고 시도했지만 멤버 값을 다시 설정했지만 여전히 동일한 오류가 발생합니다. 가장 좋은 방법은 무엇입니까?PHP - 객체를 배열에 넣기

오류 :

PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 71 bytes) 

코드 :

if(!array_key_exists($a->name, $tArray)) $tArray[] = $a; 
+0

보기 : http://stackoverflow.com/questions/561066/php-fatal-error-allowed-memory-size-of-134217728-bytes-exhausted-codeigniter – Maetschl

+0

개체는 참조가 아니라 값으로 전달됩니다. . 따라서 객체를 재사용하고 속성을 변경하면 배열의 기존 참조가 모두 변경됩니다. 개체를 반복하면서 배열로 푸는 경우이를 극복하기 위해 [clone] (http://php.net/manual/en/internals2.opcodes.clone.php) 메서드를 사용하여 새 개체를 인스턴스화해야합니다 . 그렇지 않으면 배열에 동일한 객체에 대한 참조가 모두 포함됩니다. 자세한 내용은 [this] (http://stackoverflow.com/questions/1064854/storing-objects-in-an-array-with-php) 문서를 참조하십시오. – War10ck

+0

Maetschl, 의견이 내 문제를 해결했습니다. – ExceptionLimeCat

답변

3

당신은 버그가 있습니다. 이렇게하십시오 :

if(!array_key_exists($a->name, $tArray)) $tArray[$a->name] = $a; 

그렇지 않으면 array_key_exists는 항상 false를 반환하고 항상 $ a를 추가합니다.

+1

OP가 기존 객체를 반복하고 "재사용"할 때마다 어레이의 모든 참조가 변경되지 않도록 복제해야합니다. 이는 객체가 참조가 아닌 값으로 전달된다는 사실 때문입니다. – War10ck

+0

원래이 방법을 시도한 방법이지만이 오류가 발생합니다. '최대 실행 시간 30 초 초과' – ExceptionLimeCat

+0

@ExceptionLimeCat 작업중인 개체의 수는 얼마입니까? – dlp