PHP 배열의 값을 지우는 가장 좋은 방법


172

배열의 모든 값을 지우는 데 더 효과적인 것은 무엇입니까? 첫 번째는 두 번째 예제의 루프에서 매번 해당 기능을 사용해야합니다.

foreach ($array as $i => $value) {
    unset($array[$i]);
}

아니면 이거

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}

5
무슨 일이야 unset($array)?
Blake

13
변수를 삭제합니다.
el_pup_le

2
그래, 왜 그렇게 설정 한 null 배열을 평가하고 싶니?
Blake

3
출처? 메모리에 변수가 var이 null보다 작은 것처럼 보이지 않습니다.
Blake

답변:


256

Zack이 아래 주석에서 말했듯이 간단히 사용하여 다시 인스턴스화 할 수 있습니다

$foo = array(); // $foo is still here

더 강력한 무언가를 원한다면 기호 테이블에서 $ foo를 지우므로 나중에 배열을 다시 인스턴스화해야합니다.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again

63
왜 그냥 다시 인스턴스화하지 $foo = array();않습니까?
Zack Zatkin-Gold

2
@NishamMahsin 둘 중 하나를 사용 global $foo; unset($foo);하거나unset($GLOBALS['foo']);
Eric Herlitz

7
@vivoconunxino 필자는 "PHP 배열의 값을 지우는 가장 좋은 방법"이라는 저자의 질문 때문에 그렇게 썼습니다. '새 인스턴스'가 아니라 '명확'합니다. 기호 테이블에서 사용 unset이 지워 $foo집니다. 나는 우리가 $foo = null; unset($foo);메모리를 조금 더 깨끗하게 할 수 있기 때문에 내가 추천할만한 매우 큰 테이블에 대해 이야기 하고 있습니다. 그러나이 동작 (GC)은 그다지 일정하지 않으며 PHP 버전에서 변경 될 수 있습니다.
Eric Herlitz

5
unset ()은 때때로 매우 나쁘고 잘못 사용하면 문제를 일으킬 수 있습니다. OP 답변에 올바르게 답변하지 않습니다. 그가 왜 이것을 최선의 대답으로 받아들 였는지 모릅니다. 자신의 질문에 대한 그의 의견은 unset의 문제는 변수를 삭제한다는 것입니다. 이 솔루션으로 인해 발생하는 모든 문제를 보려면 여기 에서 내 대답을 살펴보십시오 .
Wolfsblvt

2
모든 지원 $foo = array();: 실제로 개념적인 문제가있을 수 있습니다 : 구조를 다시 인스턴스화하는 것은 비우는 것과 다릅니다. 메모리를 다룰 때 할당 속도가 느리다는 것과는 다릅니다. 따라서 사용 편의성에도 불구하고 재 인스턴스화는이 질문에 대한 답변이 아닐 수 있습니다. 작동하지만 PHP 메모리 관리, IMO에 크게 의존합니다.
TechNyquist

82

변수를 빈 배열로 재설정하려면 간단히 다시 초기화하면됩니다.

$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

3
이것이 가장 좋은 대답이라고 생각합니다. 받아 들여야합니다. 가장 간단한 방법을 보여주고 unset사용해야하는 이유와시기도 설명 합니다. +1

이것은 내 코드입니다 : justpaste.it/1gt46 . 변수에 둘 이상의 ID를 어떻게 선언 할 수 있습니까? 단일 값 선언은 다음과 같습니다. $ productId = 19; $ productId =에서 둘 이상의 값을 선언하려면 어떻게해야합니까?
Gem

@Rathinam 배열을 지우는 것과 관련이 있는지 확실하지 않습니다. Stackoverflow에 새 질문을 게시하고 코드를 질문에 직접 붙여 넣으십시오.
mpen

32

슬프게도 나는 다른 질문에 대답 할 수없고, 평판이 충분하지 않지만, 나에게 매우 중요한 것을 지적해야하며, 그것이 다른 사람들에게도 도움이 될 것이라고 생각합니다.

원래 배열의 참조가 필요하지 않으면 변수를 설정 해제하는 것이 좋습니다 .

의미하는 바를 분명히하기 위해 : 함수가 있다면 배열의 참조를 사용합니다 (예 :

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.


3
OP가 전체 배열 변수를 역 참조하지 않고 명확한 배열 값을 말합니다.
Ross

13

배열이 연관되어 있다면 첫 번째라고 말하고 싶습니다. 그렇지 않은 경우 for루프를 사용하십시오 .

for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }

가능하다면

$array = array();

배열을 빈 배열로 재설정하는 것이 좋습니다.





2

배열을 지우려면 unset ()을 사용했지만 unset ()은 배열을 null로 렌더링하므로 예를 들어 배열을 다시 선언해야합니다.

<?php 
    $arr = array();
    array_push($arr , "foo");
    unset($arr); // this will set the array to null hence you need the line below or redeclaring it.
    $arr  = array();

    // do what ever you want here
?>

1

나는이 질문들이 실제로 오래된 것을 보았지만, 그 문제에 대해 배열의 모든 값을 설정 해제하기 위해 재귀 함수를 작성했습니다. 주어진 배열의 값이 배열 일 수도 있기 때문에 재귀 적입니다. 그래서 그것은 나를 위해 작동합니다 :

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;

}

따라서 모든 키와 하위 배열이 있지만 빈 값이있는 배열을 얻습니다.


1

어쩌면 간단하고 경제적 인 방법 (사용 징후가 적음) ...

$array = [];

우리는 PHP 매뉴얼에서 읽을 수 있습니다 :

PHP 5.4부터는 array ()를 []로 바꾸는 짧은 배열 구문을 사용할 수도 있습니다.


또한 설명해야합니다.
Kulshreshth K

0

해제 가비지 컬렉터가 점심 시간을 가지고 있지 동안의 순찰을 수행 할 때 유용한 기능입니다;

그러나 설정되지 않은 함수는 단순히 데이터에 대한 변수 참조를 파괴합니다. 데이터는 여전히 메모리에 존재하며 PHP는 더 이상 포인터가 없어도 메모리를 사용중인 것으로 간주합니다.

솔루션 :null 가비지 콜렉터가 데이터를 보유 할 때까지 데이터를 지우려면 변수에 지정하십시오 .

$var = null;

그리고 비슷한 방법으로 설정을 해제하십시오!

unset($var);

4
소리가 잘 들리지 않습니다. null가비지 수집을 강제로 수행하도록 설정하지는 않습니다 . 그것에 대한 참조가 있습니까?
mpen

@mpen 이 예제에서 할당 NULL$var변수 의 위치에 저장된 값을 대체 한다는 데 동의하십니까 ?
Anthony Rutledge

1
@AnthonyRutledge 아뇨. 내가 아는 한, PHP는 단순히 $var전역 NULL객체 를 가리 키도록 업데이트 하고 $var가비지 수집 될 때까지 데이터를 그대로 둡니다 . 인터프리터가 해당 데이터를 즉시 덮어 쓰게되는 이유는 무엇입니까?
mpen

@mpen 좋은 질문이지만, 그 세계에서는 최소한 모든 것이 수집 될 준비가되어 있습니다.
Anthony Rutledge

과연. 포인트는 내가 어떤 도움이 될 것입니다 해제하기 전에 널 (null)로 설정 의심이다
mpen

-1

이것은 강력하고 테스트 된 unset ($ gradearray); // 배열 재설정


1
질문에 대답하기 위해 당신은 어느 것이 가장 좋은 방법이며 왜 그런지를 설명해야합니다
Fabian Horlacher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.