Après array_filter(), comment puis-je réinitialiser les clés pour qu'elles soient classées par ordre numérique en commençant à 0

StackOverflow https://stackoverflow.com/questions/3401850

  •  25-09-2019
  •  | 
  •  

Question

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

Comment puis-je facilement réinitialiser les index du tableau pour qu'ils commencent à 0 et soient classés dans l'ordre dans le NOUVEAU tableau, plutôt que de conserver les anciens index ?

Était-ce utile?

La solution

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

Autres conseils

Si vous utilisez le filtre Array faire comme suit

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

Utilisation 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

Je m'inquiète du nombre de programmeurs qui ont innocemment copié/collé le array_values(array_filter()) méthode dans leurs codes -- Je me demande combien de programmeurs ont involontairement rencontré des 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 au processus de décapage en deux parties NULL éléments d’un tableau et réindexation des clés.

Cependant, il est tout d'abord extrêmement important de souligner le caractère cupide des array_filter() et comment cela peut silencieusement détruire votre projet.Voici un tableau contenant 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 tableau_valeurs() & tableau_filter():

array_values(array_filter($array));

Tableau de sortie ($array) :

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

Maintenant, regardez ce que vous obtenez avec ma méthode qui utilise tableau_walk() & est_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 ($filter) :

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 solution simple, portable et fiable pour tous vos besoins de filtrage nul de matrice.Voici une manifestation.



De même, si vous souhaitez supprimer les éléments vides, faux et nuls (en conservant les 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')));

Sortir:

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

Enfin, pour tous ceux qui préfèrent la syntaxe des constructions de langage, vous pouvez également simplement pousser les valeurs qualificatives 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top