배열의 모든 값을 지우는 데 더 효과적인 것은 무엇입니까? 첫 번째는 두 번째 예제의 루프에서 매번 해당 기능을 사용해야합니다.
foreach ($array as $i => $value) {
unset($array[$i]);
}
아니면 이거
foreach($blah_blah as $blah) {
$foo = array();
//do something
$foo = null;
}
배열의 모든 값을 지우는 데 더 효과적인 것은 무엇입니까? 첫 번째는 두 번째 예제의 루프에서 매번 해당 기능을 사용해야합니다.
foreach ($array as $i => $value) {
unset($array[$i]);
}
아니면 이거
foreach($blah_blah as $blah) {
$foo = array();
//do something
$foo = null;
}
답변:
Zack이 아래 주석에서 말했듯이 간단히 사용하여 다시 인스턴스화 할 수 있습니다
$foo = array(); // $foo is still here
더 강력한 무언가를 원한다면 기호 테이블에서 $ foo를 지우므로 나중에 배열을 다시 인스턴스화해야합니다.
unset($foo); // $foo is gone
$foo = array(); // $foo is here again
$foo = array();
않습니까?
global $foo; unset($foo);
하거나unset($GLOBALS['foo']);
unset
이 지워 $foo
집니다. 나는 우리가 $foo = null; unset($foo);
메모리를 조금 더 깨끗하게 할 수 있기 때문에 내가 추천할만한 매우 큰 테이블에 대해 이야기 하고 있습니다. 그러나이 동작 (GC)은 그다지 일정하지 않으며 PHP 버전에서 변경 될 수 있습니다.
$foo = array();
: 실제로 개념적인 문제가있을 수 있습니다 : 구조를 다시 인스턴스화하는 것은 비우는 것과 다릅니다. 메모리를 다룰 때 할당 속도가 느리다는 것과는 다릅니다. 따라서 사용 편의성에도 불구하고 재 인스턴스화는이 질문에 대한 답변이 아닐 수 있습니다. 작동하지만 PHP 메모리 관리, IMO에 크게 의존합니다.
변수를 빈 배열로 재설정하려면 간단히 다시 초기화하면됩니다.
$foo = array();
이것에 대한 참조가 유지됩니다.
$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!
참조를 끊으려면 먼저 설정을 해제하십시오.
$foo = array(1,2,3);
$bar = &$foo;
// ...
unset($foo); // break references
$foo = array(); // re-initialize to empty array
var_dump($bar); // array(3) { 1, 2, 3 } -- $bar is unchanged
슬프게도 나는 다른 질문에 대답 할 수없고, 평판이 충분하지 않지만, 나에게 매우 중요한 것을 지적해야하며, 그것이 다른 사람들에게도 도움이 될 것이라고 생각합니다.
원래 배열의 참조가 필요하지 않으면 변수를 설정 해제하는 것이 좋습니다 .
의미하는 바를 분명히하기 위해 : 함수가 있다면 배열의 참조를 사용합니다 (예 :
function special_sort_my_array(&$array)
{
$temporary_list = create_assoziative_special_list_out_of_array($array);
sort_my_list($temporary_list);
unset($array);
foreach($temporary_list as $k => $v)
{
$array[$k] = $v;
}
}
그것은 작동하지 않습니다! 여기서주의 unset
하여 참조를 삭제하므로 변수 $array
가 다시 작성되고 올바르게 채워지지만 함수 외부에서는 값에 액세스 할 수 없습니다.
따라서 참조 가있는 경우 덜 깨끗하고 이해하기 쉽더라도 $array = array()
대신 대신 사용해야 합니다 unset
.
어때요 $array_name = array();
?
사용하여 array_splice
배열을 비우고 기준을 유지하기 위해 :
array_splice($myArray, 0);
나는이 질문들이 실제로 오래된 것을 보았지만, 그 문제에 대해 배열의 모든 값을 설정 해제하기 위해 재귀 함수를 작성했습니다. 주어진 배열의 값이 배열 일 수도 있기 때문에 재귀 적입니다. 그래서 그것은 나를 위해 작동합니다 :
function empty_array(& $complete_array) {
foreach($complete_array as $ckey => $cvalue)
{
if (!is_array($cvalue)) {
$complete_array[$ckey] = "";
} else {
empty_array( $complete_array[$ckey]);
}
}
return $complete_array;
}
따라서 모든 키와 하위 배열이 있지만 빈 값이있는 배열을 얻습니다.
어쩌면 간단하고 경제적 인 방법 (사용 징후가 적음) ...
$array = [];
우리는 PHP 매뉴얼에서 읽을 수 있습니다 :
PHP 5.4부터는 array ()를 []로 바꾸는 짧은 배열 구문을 사용할 수도 있습니다.
해제 가비지 컬렉터가 점심 시간을 가지고 있지 동안의 순찰을 수행 할 때 유용한 기능입니다;
그러나 설정되지 않은 함수는 단순히 데이터에 대한 변수 참조를 파괴합니다. 데이터는 여전히 메모리에 존재하며 PHP는 더 이상 포인터가 없어도 메모리를 사용중인 것으로 간주합니다.
솔루션 :null
가비지 콜렉터가 데이터를 보유 할 때까지 데이터를 지우려면 변수에
지정하십시오 .
$var = null;
그리고 비슷한 방법으로 설정을 해제하십시오!
unset($var);
null
가비지 수집을 강제로 수행하도록 설정하지는 않습니다 . 그것에 대한 참조가 있습니까?
NULL
이 $var
변수 의 위치에 저장된 값을 대체 한다는 데 동의하십니까 ?
$var
전역 NULL
객체 를 가리 키도록 업데이트 하고 $var
가비지 수집 될 때까지 데이터를 그대로 둡니다 . 인터프리터가 해당 데이터를 즉시 덮어 쓰게되는 이유는 무엇입니까?
이것은 강력하고 테스트 된 unset ($ gradearray); // 배열 재설정
unset($array)
?