888 votes

Suppression des éléments vides du tableau

Certains éléments de mon tableau sont des chaînes vides en fonction de ce que l'utilisateur a soumis. J'ai besoin de supprimer ces éléments. J'ai ceci :

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

Mais ça ne marche pas. $linksArray a toujours des éléments vides. J'ai également essayé de le faire avec le empty() mais le résultat est le même.

2 votes

J'ai pensé qu'il était utile de mentionner que le code ci-dessus ne fonctionne pas parce que unset(...) opère sur la variable créée par la boucle foreach, et non sur le tableau original qui reste évidemment tel qu'il était avant la boucle.

0 votes

If(!empty($link)) { echo $link ; } ceci fonctionne pour moi

0 votes

Vous modifiez un $link qui n'est pas refferencé ! use foreach($linksArray as $key => $link) unset(linksArray[$key])

1741voto

BoltClock Points 249668

Comme vous avez affaire à un tableau de chaînes de caractères, vous pouvez simplement utiliser array_filter() qui se charge de tout cela pour vous :

print_r(array_filter($linksArray));

Gardez à l'esprit que si aucun callback n'est fourni toutes les entrées du tableau sont égales à FALSE (voir convertir en booléen ) seront supprimés. Donc, si vous avez besoin de préserver des éléments qui sont, par exemple, des chaînes exactes '0' vous aurez besoin d'un rappel personnalisé :

// PHP 7.4 and later
print_r(array_filter($linksArray, fn($value) => !is_null($value) && $value !== ''));

// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return !is_null($value) && $value !== ''; }));

// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));

0 votes

C'était une faute de frappe haha, désolé. C'est correct dans mon code réel. Merci pour la réponse :)

2 votes

J'utiliserais empty sur == '' . Mais merci pour la référence :)

17 votes

array_filter doit supprimer les éléments vides. Et si la définition de vide par PHP n'est pas tout à fait la même que la vôtre, alors vous pouvez remplir l'option de rappel avec une fonction anonyme qui jette les éléments non désirés. Apparemment, vous devez avoir php 5.3 ou plus pour utiliser les fonctions de rappel anonymes. stackoverflow.com/questions/2412299/

177voto

Andrew Moore Points 49765

Vous pouvez utiliser array_filter pour supprimer les éléments vides :

$emptyRemoved = array_filter($linksArray);

Si vous avez (int) 0 dans votre tableau, vous pouvez utiliser les éléments suivants :

$emptyRemoved = remove_empty($linksArray);

function remove_empty($array) {
  return array_filter($array, '_remove_empty_internal');
}

function _remove_empty_internal($value) {
  return !empty($value) || $value === 0;
}

EDIT : Peut-être que vos éléments ne sont pas vides en soi mais contiennent un ou plusieurs espaces... Vous pouvez utiliser ce qui suit avant d'utiliser array_filter

$trimmedArray = array_map('trim', $linksArray);

11 votes

Je viens de l'ajouter à la réponse acceptée par BoltClock, vous pourriez simplement faire array_filter($foo, 'strlen') pour éviter le problème du "0" et ne supprimer que ceux dont la longueur est nulle.

2 votes

@nezZario : En supposant que vous avez seulement scalar éléments dans votre tableau oui. Sinon, vous ne pouvez pas le faire.

2 votes

Utilisation de lambda pour php >= 5.3 function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }

104voto

Yorirou Points 2989
$linksArray = array_filter($linksArray);

"Si aucun callback n'est fourni, toutes les entrées de l'entrée égale à FALSE seront supprimées." -- http://php.net/manual/en/function.array-filter.php

4 votes

J'ai aussi essayé ceci après avoir cherché le problème sur Google. Malheureusement, cela ne laisse que des éléments vides pour moi.

2 votes

@Will : êtes-vous sûr ? Il supprime également les chaînes vides, je l'ai testé avec succès. Peut-être que vos valeurs d'entrée contiennent des espaces et devraient être coupées avant. D'après le règles de conversion booléenne la chaîne vide est évaluée à false et donc supprimée par array_filter.

55voto

matija kancijan Points 667
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values

0 votes

Strlen supprime aussi les faux :(

1 votes

Seulement si false est une chaîne. Un booléen false n'a pas de longueur de chaîne.

46voto

helpse Points 445

Vous pouvez juste faire

array_filter($array)

array_filter : "Si aucune callback n'est fournie, toutes les entrées dont la valeur est égale à FALSE seront supprimées." Cela signifie que les éléments ayant pour valeurs NULL, 0, '0', '', FALSE, array() seront également supprimés.

L'autre option est de faire

array_diff($array, array(''))

qui supprimera les éléments ayant les valeurs NULL, '' et FALSE.

J'espère que cela vous aidera :)

UPDATE

Voici un exemple.

$a = array(0, '0', NULL, FALSE, '', array());

var_dump(array_filter($a));
// array()

var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());

var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())

Pour résumer :

  • 0 ou '0' supprimera 0 et '0'.
  • NULL, FALSE ou '' supprimera NULL, FALSE et ''.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X