Melhor maneira de limpar os valores de uma matriz PHP

172

Qual é mais eficiente para limpar todos os valores em uma matriz? O primeiro exigiria que eu usasse essa função todas as vezes no loop do segundo exemplo.

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

Ou isto

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}
el_pup_le
fonte
5
O que há de errado unset($array)?
Blake
13
exclui a variável
el_pup_le
2
Sim, mas por que você gostaria de avaliar uma matriz nula definida dessa maneira?
Blake
3
Fonte? Nenhuma variável na memória parece não ser menor que var é nulo.
Blake

Respostas:

256

Como Zack disse nos comentários abaixo, você pode simplesmente re-instanciar usando

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

Se você quiser algo mais poderoso, use unset, pois ele também limpará $ foo da tabela de símbolos, se você precisar da matriz mais tarde, instancie-a novamente.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
Eric Herlitz
fonte
63
Por que não apenas re-instanciar como $foo = array();?
Zack Zatkin-Gold
2
@NishamMahsin Ou use global $foo; unset($foo);ouunset($GLOBALS['foo']);
Eric Herlitz
7
@vivoconunxino Eu escrevi dessa maneira por causa da pergunta dos autores "Melhor maneira de limpar os valores de uma matriz PHP". É "claro", não "nova instância". O uso unsetserá apagado $fooda tabela de símbolos. Estamos falando de tabelas muito grandes que eu provavelmente recomendaria, $foo = null; unset($foo);pois isso também limparia a memória um pouco melhor. Esse comportamento (GC), no entanto, não é muito constante e pode mudar nas versões do PHP.
quer
5
unset () às vezes é muito ruim e pode causar problemas, se você usá-lo errado. Ele não responde os OPs respondem corretamente. Não sei por que ele aceitou isso como a melhor resposta, seu comentário sobre sua própria pergunta diz que o problema com a falta de definição é que ela exclui a variável. Para ver quais problemas essas soluções causam, dê uma olhada na minha resposta aqui .
Wolfsblvt
2
Para todos os que apoiam $foo = array();: na verdade, pode haver um problema conceitual: re-instanciar uma estrutura não é o mesmo que esvaziá-la. Ao lidar com a memória, você sabe que não é a mesma coisa que a alocação é lenta. Portanto, apesar da facilidade de uso, a re-instanciação pode não ser a resposta para essa pergunta, principalmente se for necessário fazê-lo várias vezes e rapidamente. Pode funcionar, mas isso dependeria muito do gerenciamento de memória PHP, IMO.
TechNyquist 18/02
82

Se você deseja redefinir uma variável para uma matriz vazia, basta reinicializá-la:

$foo = array();

Observe que isso manterá qualquer referência a ele:

$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!

Se você deseja interromper qualquer referência a ele, desative-o primeiro:

$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
mpen
fonte
3
Eu acho que essa é a melhor resposta. Deve ser aceito. Ele mostra a maneira mais simples e também descreve por que e quando unsetdeve ser usado. 1
Este é o meu código: justpaste.it/1gt46 . Como posso declarar mais de um ID na variável A declaração de valor único é: $ productId = 19; Como posso declarar mais de um valor em $ productId =?
Gem
@Rathinam Não tenho certeza do que isso tem a ver com a limpeza de uma matriz. Publique uma nova pergunta no Stackoverflow e cole seu código diretamente na pergunta.
MPEN
32

Infelizmente, não posso responder às outras perguntas, não tenho reputação suficiente, mas preciso apontar algo que foi MUITO importante para mim e acho que ajudará outras pessoas também.

Desativar a variável é uma boa maneira, a menos que você precise da referência da matriz original!

Para esclarecer o que quero dizer: se você tem uma função que usa a referência da matriz, por exemplo, uma função de classificação como

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;
    }
}

Não está funcionando! Tenha cuidado aqui, unsetexclui a referência, para que a variável $arrayseja criada novamente e preenchida corretamente, mas os valores não podem ser acessados ​​de fora da função.

Portanto, se você tiver referências, precisará usar em $array = array()vez de unset, mesmo que seja menos limpo e compreensível.

Wolfsblvt
fonte
3
essa deve ser a resposta - o OP diz valores claros das matrizes, não desmarcando toda a variável da matriz.
28715 Ross
13

Eu diria o primeiro, se a matriz é associativa. Caso contrário, use um forloop:

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

Embora se possível, o uso de

$array = array();

Redefinir a matriz para uma matriz vazia é preferível.

Fantasma de Madara
fonte
9

Não é unset()bom o suficiente?

unset($array);
John Conde
fonte
6

Que tal $array_name = array();?

Bibhas Debnath
fonte
5

Use array_splicepara esvaziar uma matriz e reter a referência:

array_splice($myArray, 0);

Allan Jardine
fonte
2

Eu usei unset () para limpar a matriz, mas percebi que unset () tornará a matriz nula, portanto, a necessidade de declarar novamente a matriz como por exemplo

<?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
?>
Bênção
fonte
1

Vejo que essas perguntas são antigas, mas, para esse problema, escrevi uma função recursiva para desarmar todos os valores em uma matriz. Recursivo porque é possível que os valores da matriz fornecida também sejam uma matriz. Então, isso funciona para mim:

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;

}

Então, com isso, recebo a matriz com todas as chaves e sub-matrizes, mas com valores vazios.

Bueck0815
fonte
1

Talvez maneira simples e econômica (menos sinais de uso) ...

$array = [];

Podemos ler no manual do php:

A partir do PHP 5.4, você também pode usar a sintaxe de matriz curta, que substitui array () por [].

PHP php
fonte
Você também deve explicar.
Kulshreshth K
0

A função não configurada é útil quando o coletor de lixo está fazendo suas rondas sem fazer uma pausa para o almoço;

No entanto, a função não definida simplesmente destrói a referência variável aos dados, os dados ainda existem na memória e o PHP vê a memória como sendo usada, apesar de não ter mais um ponteiro para ela.

Solução: atribua nullàs suas variáveis ​​para limpar os dados, pelo menos até que o coletor de lixo os segure.

$var = null;

e desative-o da mesma maneira!

unset($var);
Waqar Alamgir
fonte
4
Isso não parece certo. Não acho que configurá-lo nullforçará uma coleta de lixo imediata. Você tem uma referência para isso?
MPEN
@mpen Você concorda que a atribuição NULLsubstituirá o valor armazenado no local da $varvariável neste exemplo?
Anthony Rutledge
1
@AnthonyRutledge Não, eu não. Pelo que sei, o PHP simplesmente atualizará $varpara apontar para algum NULLobjeto global e deixar $varos dados em paz até que seja coletado o lixo. Por que o intérprete seria forçado a substituir esses dados imediatamente?
MPEN
@mpen Essa é uma boa pergunta, mas nesse mundo pelo menos tudo está pronto para ser coletado.
Anthony Rutledge
De fato. Ponto é que eu duvido defini-lo como nulo antes de desarmar ele vai ajudar qualquer
MPEN
-1

Isso é poderoso e testado por definir ($ gradearray); // redefine a matriz

Charles
fonte
1
Para responder à pergunta que você deve explicar qual é a melhor maneira e por que
Fabian Horlacher