web-dev-qa-db-fra.com

Après array_filter (), comment puis-je réinitialiser les clés pour aller dans l'ordre numérique à partir de 0

J'ai juste utilisé array_filter pour supprimer les entrées qui n'avaient que la valeur '' d'un tableau, et maintenant je veux lui appliquer certaines transformations en fonction de l'espace réservé à partir de 0, mais malheureusement, il conserve toujours l'index d'origine. J'ai regardé pendant un moment et je n'ai rien vu, peut-être que j'ai raté l'évidence, mais ma question est ...

Comment puis-je facilement réinitialiser les index du tableau pour commencer à 0 et aller dans l'ordre dans le nouveau tableau, plutôt que de conserver les anciens index?

88
jel402

Si vous appelez array_values sur votre tableau, il sera réindexé à partir de zéro.

188
Daniel Vandersluis

Si vous utilisez un filtre matriciel, procédez comme suit

$NewArray = array_values(array_filter($OldArray));
26
user2182143

Je m'inquiète du nombre de programmeurs qui ont innocemment copié/collé la méthode array_values(array_filter()) dans leurs codes - Je me demande combien de programmeurs ont involontairement exécuté en problèmes à cause de la cupidité de array_filter. Ou pire, combien de personnes n'ont jamais découvert que la fonction purge trop de valeurs du tableau ...

Je présenterai une meilleure alternative pour le processus en deux parties consistant à supprimer les éléments NULL d'un tableau et à réindexer les clés.

Cependant, tout d'abord, il est extrêmement important que j'insiste sur la nature gourmande de array_filter() et sur la façon dont cela peut discrètement taper votre projet. Voici un tableau avec des valeurs mixtes qui exposera le problème:

$array=['foo',NULL,'bar',0,false,null,'0',''];

Les valeurs nulles seront supprimées indépendamment des majuscules/minuscules.

Mais regardez ce qui reste dans le tableau lorsque nous utilisons array_values ​​() & array_filter () :

array_values(array_filter($array));

Tableau de sortie ($ array):

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!

Regardez maintenant ce que vous obtenez avec ma méthode qui utilise array_walk () & is_null () pour générer un nouveau tableau filtré:

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});

Cela peut être écrit sur plusieurs lignes pour une lecture/explication plus facile:

array_walk(                      // iterate each element of an input array
    $array,                      // this is the input array
    function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
        if(!is_null($v)){        // this literally checks for null values
            $filtered[]=$v;      // value is pushed into output with new indexes
        }
    }
);

Tableau de sortie (filtre $):

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

Avec ma méthode, vous obtenez vos clés réindexées, toutes les valeurs non nulles et aucune des valeurs nulles. Une doublure propre, portable et fiable pour tous vos besoins de filtrage nul de la baie. Voici un démonstration .



De même, si vous souhaitez supprimer des éléments vides, faux et nuls (en conservant des zéros), ces quatre méthodes fonctionneront:

var_export(array_values(array_diff($array,[''])));

ou

var_export(array_values(array_diff($array,[null])));

ou

var_export(array_values(array_diff($array,[false])));

ou

var_export(array_values(array_filter($array,'strlen')));

Sortie:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)

Enfin, pour quiconque préfère la syntaxe des constructions de langage, vous pouvez également simplement pousser les valeurs de qualification dans un nouveau tableau pour émettre de nouveaux index.

$array=['foo', NULL, 'bar', 0, false, null, '0', ''];

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);
11
mickmackusa

Utilisez array_values():

<?php

$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
    return $var !== 'bar';
});

print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1
10
Ed Mazur