Meilleur moyen d'effacer les valeurs d'un tableau PHP

172

Qu'est-ce qui est le plus efficace pour effacer toutes les valeurs d'un tableau? Le premier m'obligerait à utiliser cette fonction à chaque fois dans la boucle du deuxième exemple.

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

Ou ca

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}
el_pup_le
la source
5
Quel est le problème avec unset($array)?
Blake
13
supprime la variable.
el_pup_le
2
Ouais, mais pourquoi voudriez-vous évaluer un tableau nul que vous définissez de cette façon?
Blake
3
La source? Aucune variable en mémoire ne semble pas être plus petite que var est nul.
Blake

Réponses:

256

Comme Zack l'a dit dans les commentaires ci-dessous, vous pouvez simplement le ré-instancier en utilisant

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

Si vous voulez quelque chose de plus puissant, utilisez unset car il effacera également $ foo de la table des symboles, si vous avez besoin du tableau plus tard, instanciez-le à nouveau.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
Eric Herlitz
la source
63
Pourquoi ne pas simplement le ré-instancier comme $foo = array();?
Zack Zatkin-Gold
2
@NishamMahsin Soit utiliser global $foo; unset($foo);soitunset($GLOBALS['foo']);
Eric Herlitz
7
@vivoconunxino Je l'ai écrit de cette façon à cause de la question des auteurs "Meilleur moyen d'effacer les valeurs d'un tableau PHP". Il saisit «clair», pas «nouvelle instance». L'utilisation unseteffacera $foode la table des symboles. Je parle de très grandes tables que je recommanderais probablement $foo = null; unset($foo);car cela effacerait un peu mieux la mémoire. Ce comportement (GC) n'est cependant pas très constant et peut changer au fil des versions PHP.
Eric Herlitz
5
unset () est parfois très mauvais et peut causer des problèmes si vous l'utilisez mal. Il ne répond pas correctement à la réponse des OP. Je ne sais pas pourquoi il a accepté cela comme meilleure réponse, son commentaire sur sa propre question dit que le problème avec unset est qu'il supprime la variable. Pour voir quels problèmes ces solutions posent, jetez un œil à ma réponse ici .
Wolfsblvt
2
À tous les supports $foo = array();: en fait, il pourrait y avoir un problème conceptuel: ré-instancier une structure n'est pas la même chose que la vider. Lorsque vous traitez avec la mémoire, vous savez que ce n'est pas la même chose que l'allocation est lente. Ainsi, malgré la facilité d'utilisation, la ré-instanciation pourrait ne pas être la réponse à cette question, surtout si l'on a besoin de le faire beaucoup de fois et rapidement. Cela pourrait fonctionner, mais cela dépendrait fortement de la gestion de la mémoire PHP, IMO.
TechNyquist
82

Si vous souhaitez simplement réinitialiser une variable dans un tableau vide, vous pouvez simplement le réinitialiser:

$foo = array();

Notez que cela conservera toutes les références à celui-ci:

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

Si vous souhaitez casser des références à celui-ci, désactivez-le d'abord:

$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
la source
3
Je pense que c'est la meilleure réponse. Devrait être accepté. Il montre la manière la plus simple et décrit également pourquoi et quand unsetdoit être utilisé. +1
C'est mon code: justpaste.it/1gt46 . Comment puis-je déclarer plus d'un identifiant dans une variable. La déclaration de valeur unique est: $ productId = 19; Comment puis-je déclarer plus d'une valeur dans $ productId =?
Gem
@Rathinam Je ne sais pas ce que cela a à voir avec l'effacement d'un tableau. Veuillez publier une nouvelle question sur Stackoverflow et collez votre code directement dans la question.
mpen
32

Malheureusement, je ne peux pas répondre aux autres questions, je n'ai pas assez de réputation, mais je dois souligner quelque chose qui était TRÈS important pour moi, et je pense que cela aidera d'autres personnes aussi.

Désactiver la variable est un bon moyen, sauf si vous avez besoin de la référence du tableau d'origine!

Pour clarifier ce que je veux dire: si vous avez une fonction qui utilise la référence du tableau, par exemple une fonction de tri comme

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

ça ne marche pas! Attention ici, unsetsupprime la référence, donc la variable $arrayest créée à nouveau et remplie correctement, mais les valeurs ne sont pas accessibles depuis l'extérieur de la fonction.

Donc, si vous avez des références, vous devez utiliser à la $array = array()place de unset, même si c'est moins clair et compréhensible.

Wolfsblvt
la source
3
cela devrait être la réponse - l'OP indique que les valeurs des tableaux sont claires, et non la dé-référence de la variable de tableau entière.
Ross
13

Je dirais le premier, si le tableau est associatif. Sinon, utilisez une forboucle:

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

Bien que si possible, en utilisant

$array = array();

Il est préférable de réinitialiser le tableau à un tableau vide.

Fantôme de Madara
la source
6

Et pourquoi pas $array_name = array();?

Bibhas Debnath
la source
5

Utilisez array_splicepour vider un tableau et conserver la référence:

array_splice($myArray, 0);

Allan Jardine
la source
2

J'ai utilisé unset () pour effacer le tableau mais je me suis rendu compte que unset () rendra le tableau nul, d'où la nécessité de re-déclarer le tableau comme par exemple

<?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édiction
la source
1

Je vois que cette question est vraiment ancienne, mais pour ce problème, j'ai écrit une fonction récursive pour annuler toutes les valeurs d'un tableau. Récursif car il est possible que les valeurs du tableau donné soient également un tableau. Alors ça marche pour moi:

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;

}

Donc, avec cela, j'obtiens le tableau avec toutes les clés et sous-tableaux, mais des valeurs vides.

Bueck0815
la source
1

Peut-être moyen simple, économique (moins de signes à utiliser) ...

$array = [];

On peut lire dans le manuel php:

Depuis PHP 5.4, vous pouvez également utiliser la syntaxe de tableau court, qui remplace array () par [].

PHP php
la source
Vous devriez également l'expliquer.
Kulshreshth K
0

La fonction unset est utile lorsque le ramasse-miettes fait ses rondes sans avoir de pause déjeuner;

Cependant, la fonction non définie détruit simplement la référence de variable aux données, les données existent toujours en mémoire et PHP considère la mémoire comme étant en cours d'utilisation même si elle n'a plus de pointeur vers elle.

Solution: assignez nullà vos variables pour effacer les données, au moins jusqu'à ce que le ramasse-miettes les récupère.

$var = null;

puis désactivez-le de la même manière!

unset($var);
Waqar Alamgir
la source
4
Cela ne semble pas juste. Je ne pense pas que le définir sur nullforcera une collecte immédiate des déchets. Avez-vous une référence pour cela?
mpen
@mpen Acceptez-vous que l'affectation NULLremplacera la valeur stockée à l'emplacement de la $varvariable dans cet exemple?
Anthony Rutledge
1
@AnthonyRutledge Non, je ne le fais pas. Pour autant que je sache, PHP se mettra simplement à jour $varpour pointer vers un NULLobjet global et laisser $varles données de là seules jusqu'à ce qu'elles soient récupérées. Pourquoi l'interpréteur serait-il obligé d'écraser ces données immédiatement?
mpen
@mpen C'est une bonne question, mais dans ce monde au moins tout est prêt à être collecté.
Anthony Rutledge
En effet. Le fait est que je doute que le définir sur null avant de le
désactiver
-1

Ceci est puissant et testé unset ($ gradearray); // réinitialise le tableau

Charles
la source
1
Pour répondre à la question, vous devez expliquer quelle est la meilleure façon et pourquoi
Fabian Horlacher