De manière récursive supprimer des éléments vides et les sous-réseaux à partir d'un tableau multidimensionnel
Je n'arrive pas à trouver une simple solution simple pour le vieux problème de la suppression des éléments vides de tableaux en PHP.
Mon tableau d'entrée peut ressembler à ceci:
Array ( [0] => Array ( [Name] => [EmailAddress] => ) )
(Et ainsi de suite, si il y a plus de données, mais il y a peut-être pas...)
Si ça ressemble à ce qui précède, je veux qu'il soit complètement vide après que je l'ai traitée.
Donc print_r($array);
de sortie:
Array ( )
Si je lance $arrayX = array_filter($arrayX);
que j'ai toujours l' même print_r
de sortie. Partout où j'ai regardé suggère que c'est la façon la plus simple de supprimer vide d'éléments de tableau en PHP5, cependant.
J'ai aussi essayé $arrayX = array_filter($arrayX,'empty_array');
mais j'ai eu l'erreur suivante:
Avertissement: array_filter() [function.tableau-filtre]: Le deuxième argument, 'empty_array', doit être valide rappel
Ce que je fais mal?
Pouvez-vous donner un exemple de saisie, avec la sortie attendue s'il vous plaît? Il y a plusieurs façons d'interpréter à ta question, "Si ça ressemble à ce qui précède, je veux qu'il soit complètement vide après que j'ai traité il." me jetant hors, voulez-vous qu'il soit totalement parti ou à un tableau vide?
Votre nouveau message d'erreur est parce que
empty_array
n'est pas une fonction définie. Je me demande aussi ce que votre réel de cas d'utilisation est ici...La bonne réponse est dans les commentaires cidessous le accepté question. Je ne sais pas pourquoi Wesley n'a pas le tirer dans sa réponse, mais je l'ai ajouté à maintenant.
Tu serais vexé si le titre a été changé pour:
Remove empty elements then empty subarrays from a 2d array
? Cette clarification, de l'OMI, est important car en double page, les fermetures peuvent être mieux ciblé de cette manière.OriginalL'auteur Chuck Le Butt | 2012-03-27
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser
array_map()
pour appliquer le filtre à chaque tableau dans$array
:Démo: http://codepad.org/xfXEeApj
Nope. Cela ne fonctionne pas :-/
En fonction de votre question et de la clarification dans les commentaires, oui il faut: codepad.org/FdfY5aqj Lorsque tous les éléments vides sont supprimés, vous vous retrouvez avec un tableau vide. Si ce n'est pas ce que vous voulez, veuillez donner quelques exemples d'entrée avec la sortie attendue. Etes-vous préoccupé par les effets secondaires de retrait qui se vide dans les autres tableaux?
Ce genre de travaux. Il conserve encore vide clés. Donc, si
[0][EmailAddress]
est vide,[0]
existe toujours. Cela dit, il semble que ça fonctionne avec ce que j'en ai besoin, donc merci!Eh bien, c'est pas un tableau vide, c'est un tableau avec les clés. Je ne sais pas comment le décrire un tableau vide! Comme un tableau qui a été déclarée comme suit:
$array = new array();
OriginalL'auteur
Il existe de nombreux exemples de la façon de faire. Vous pouvez essayer le docs, pour l'un (voir le premier commentaire).
Accordé cet exemple ne fait pas les utiliser
array_filter
mais vous obtenez le point.OriginalL'auteur
Accepté la réponse ne fait pas exactement ce que l'OP a demandé. Si vous voulez récursive de supprimer TOUTES les valeurs que la valeur false, y compris des tableaux vides puis utiliser la fonction suivante:
Ou vous pouvez modifier la condition selon vos besoins, par exemple:
Si vous souhaitez supprimer des tableaux vides. Ou vous pouvez changer la condition à tester pour "" ou false ou null, etc...
OriginalL'auteur
Suivi jeremyharris suggestion, c'est la façon dont j'avais besoin de le modifier pour le faire fonctionner:
OriginalL'auteur
Essayer avec:
Exemple:
De sortie:
OriginalL'auteur
array_filter()
n'est pas de type sensible par défaut. Cela signifie que toute zéro-ish, faux-y, null, valeurs vides seront supprimés. Mes liens à suivre vous démontrer ce point.L'OP de l'échantillon tableau d'entrée est à 2 dimensions. Si la structure de données est statique alors la récursivité n'est pas nécessaire. Pour toute personne qui souhaite filtrer les valeurs de longueur nulle à partir d'un tableau multidimensionnel, je vais vous donner un statique à 2 dim méthode et une méthode récursive.
Statique 2-dim Tableau:
Ce code effectue un "zéro-safe" filtre sur le 2e niveau des éléments et ensuite supprime vide sous-tableaux: (Voir cette démo pour voir cette méthode de travail avec les différents (délicat) de la matrice de données)
Ici est le même code que un one-liner:
De sortie (comme il a été spécifié par l'OP):
*si vous ne voulez pas supprimer le vide des sous-tableaux, il suffit de retirer l'extérieur
array_filter()
appel.Méthode récursive pour les multi-dimensions des tableaux de profondeur inconnue: Lorsque le nombre de niveaux dans un tableau sont inconnus, la récursivité est une logique technique. Le code suivant va traiter chaque subarray, en supprimant les valeurs de longueur nulle et vide des sous-tableaux comme il va. Voici une démo de ce code avec un échantillon de quelques entrées.
De sortie:
Si quelqu'un découvre un tableau d'entrée qui brise ma méthode récursive, s'il vous plaît poster (dans sa forme la plus simple) comme un commentaire et je vais mettre à jour ma réponse.
OriginalL'auteur