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;
}
unset($array)
?Respostas:
Como Zack disse nos comentários abaixo, você pode simplesmente re-instanciar usando
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.
fonte
$foo = array();
?global $foo; unset($foo);
ouunset($GLOBALS['foo']);
unset
será apagado$foo
da 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.$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.Se você deseja redefinir uma variável para uma matriz vazia, basta reinicializá-la:
Observe que isso manterá qualquer referência a ele:
Se você deseja interromper qualquer referência a ele, desative-o primeiro:
fonte
unset
deve ser usado. 1Infelizmente, 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
Não está funcionando! Tenha cuidado aqui,
unset
exclui a referência, para que a variável$array
seja 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 deunset
, mesmo que seja menos limpo e compreensível.fonte
Eu diria o primeiro, se a matriz é associativa. Caso contrário, use um
for
loop:Embora se possível, o uso de
Redefinir a matriz para uma matriz vazia é preferível.
fonte
Não é
unset()
bom o suficiente?fonte
Que tal
$array_name = array();
?fonte
Use
array_splice
para esvaziar uma matriz e reter a referência:array_splice($myArray, 0);
fonte
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
fonte
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:
Então, com isso, recebo a matriz com todas as chaves e sub-matrizes, mas com valores vazios.
fonte
Talvez maneira simples e econômica (menos sinais de uso) ...
Podemos ler no manual do php:
fonte
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.e desative-o da mesma maneira!
fonte
null
forçará uma coleta de lixo imediata. Você tem uma referência para isso?NULL
substituirá o valor armazenado no local da$var
variável neste exemplo?$var
para apontar para algumNULL
objeto global e deixar$var
os dados em paz até que seja coletado o lixo. Por que o intérprete seria forçado a substituir esses dados imediatamente?Isso é poderoso e testado por definir ($ gradearray); // redefine a matriz
fonte