web-dev-qa-db-fra.com

Supprimer des éléments de tableau vides

Certains éléments de mon tableau sont des chaînes vides basées sur ce que l'utilisateur a soumis. Je dois enlever ces éléments. J'ai ceci:

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

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

675
Will

Comme vous avez affaire à un tableau de chaînes, vous pouvez simplement utiliser array_filter() , qui gère facilement tout cela pour vous:

print_r(array_filter($linksArray));

Gardez à l'esprit que si aucun rappel n'est fourni, toutes les entrées du tableau égal à FALSE (voir conversion en boolean ) seront supprimées. Donc, si vous devez conserver des éléments qui sont, par exemple, la chaîne exacte '0', vous aurez besoin d’un rappel personnalisé:

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

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

Vous pouvez utiliser array_filter pour supprimer des é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 eux-mêmes mais contiennent un ou plusieurs espaces ... Vous pouvez utiliser ce qui suit avant d'utiliser array_filter

$trimmedArray = array_map('trim', $linksArray);
152
Andrew Moore
$linksArray = array_filter($linksArray);

"Si aucun rappel n'est fourni, toutes les entrées ayant la valeur FALSE seront supprimées." - http://php.net/manual/en/function.array-filter.php

93
tamasd

La réponse la plus populaire sur ce sujet est absolument INCORRECT.

Considérez le script PHP suivant:

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));

Pourquoi est-ce? Etant donné qu'une chaîne contenant un seul caractère '0' est également évaluée à booléen, elle sera donc filtrée même si elle n'est pas vide. Ce serait un bug.

Le fait de passer la fonction strlen intégrée en tant que fonction de filtrage fonctionnera, car elle renvoie un entier non nul pour une chaîne non vide et un entier nul pour une chaîne vide. Les entiers non nuls sont toujours évalués sur true lors de la conversion en booléen, alors que les entiers zéro sont toujours évalués sur false lors de la conversion en boolean.

Donc, la réponse absolue, définitive et correcte est:

$arr = array_filter($arr, 'strlen');
90
Ron Cemer
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values
51
matija kancijan

Vous pouvez juste faire

array_filter($array)

array_filter: "Si aucun rappel n'est fourni, toutes les entrées d'entrées égales à FALSE seront supprimées." Cela signifie que les éléments avec les 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 avec les valeurs NULL, '' et FALSE.

J'espère que cela t'aides :)

METTRE À JOUR

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 ''
39
helpse
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 
28
Mark Baker

Une autre ligne pour supprimer les éléments vides ("" chaîne vide) de votre tableau.

$array = array_filter($array, create_function('$a','return $a!=="";'));

Remarque: Ce code conserve délibérément les éléments null, 0 et false.


Ou peut-être voulez-vous d'abord couper vos éléments de tableau:

$array = array_filter($array, create_function('$a','return trim($a)!=="";'));

Remarque: Ce code supprime également les éléments null et false.

22
marcovtwout

En bref:

Ceci est mon code suggéré:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

Explication:

Je pense que l'utilisation de array_filter est bonne, mais pas suffisante, car les valeurs ressemblent à space et \n, ... à conserver dans le tableau et c'est généralement mauvais.

Je vous suggère donc d'utiliser le mélange ‍‍array_filter et array_map.

array_map est pour le rognage, array_filter est pour supprimer les valeurs vides, strlen est pour garder 0 valeur, et array_values pour indexer si nécessaire.

Échantillons:

$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");

// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);

// "a"
$new2 = array_filter(array_map('trim', $myarray));

// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');

// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));

var_dump($new1, $new2, $new3, $new4);

Résultats:

array(5) {
  [0]=>
" string(1) "
  [1]=>
  string(1) "
"
  [2]=>
  string(2) "
"
  [4]=>
  string(1) " "
  [6]=>
  string(1) "a"
}
array(1) {
  [6]=>
  string(1) "a"
}
array(2) {
  [5]=>
  string(1) "0"
  [6]=>
  string(1) "a"
}
array(2) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "a"
}

Test en ligne:

http://phpio.net/s/5yg0

13
Nabi K.A.Z.

Si vous travaillez avec un tableau numérique et que vous devez le réindexer après avoir supprimé les éléments vides, utilisez la fonction array_values ​​:

array_values(array_filter($array));

Voir aussi: PHP tableau de réindexation?

10
mulquin

La réponse la plus votée est faux ou du moins pas tout à fait vraie car le PO ne parle que de chaînes vierges. Voici une explication détaillée:

Que signifie empty?

Tout d’abord, nous devons nous mettre d’accord sur ce que empty signifie. Voulez-vous dire filtrer:

  1. les chaînes vides seulement ("")?
  2. les strictement fausses valeurs? ($element === false)
  3. les valeurs falsey? (c'est-à-dire 0, 0.0, "", "0", NULL, array () ...)
  4. l'équivalent de la fonction empty() de PHP?

Comment filtrez-vous les valeurs

Pour filtrer chaînes vides uniquement:

$filtered = array_diff($originalArray, array(""));

Pour filtrer uniquement les valeurs strictement false, vous devez utiliser une fonction callback:

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}

Le rappel est également utile pour toute combinaison dans laquelle vous souhaitez filtrer les valeurs "falsey", sauf certaines. (Par exemple, filtrez toutes les null et false, etc., en ne laissant que 0):

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}

Les troisième et quatrième cas sont équivalents (enfin, à nos fins), et pour cela tout ce que vous devez utiliser est la valeur par défaut:

$filtered = array_filter($originalArray);
9
Cranio
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));

print_r($b)
8
user2511140

Pour tableau multidimensionnel 

$data = array_map('array_filter', $data);
$data = array_filter($data);
7
HMagdy

J'utilise le script suivant pour supprimer des éléments vides d'un tableau

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }
7
concept w

Je devais le faire pour conserver une valeur de tableau de (chaîne) 0

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});
7
Matt
$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);
6
Naitik Shah
function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}
6
ali Farmani
foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}
5
mak ashtekar

Je veux juste apporter une alternative aux boucles ... tout en comblant les lacunes dans les clés ...

Dans mon cas, je souhaitais conserver des clés de tableau séquentielles à la fin de l'opération (pas uniquement des nombres impairs, mais c'est ce que je cherchais. Configurer du code pour rechercher uniquement des clés impaires me semblait fragile et non futuriste.)

Je cherchais quelque chose de plus semblable à ceci: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

La combinaison de array_filter et array_slice fait l'affaire.

$example = array_filter($example); $example = array_slice($example,0);

Aucune idée sur l'efficacité ou les points de repère, mais ça marche.

5
Chrisdigital

Juste une ligne: Update (merci à @suther):

$array_without_empty_values = array_filter($array);
4
Matt
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");   

foreach ($my as $key => $value) {
    if (is_null($value)) unset($my[$key]);
}

foreach ($my as $key => $value) {
    echo   $key . ':' . $value . '<br>';
} 

sortie

1: 5

2: 6

4
Naitik Shah

utilisez la fonction array_filter pour supprimer les valeurs vides:

$linksArray = array_filter($linksArray);
print_r($linksArray);
4
Ankit Gupta

Supprimer des éléments de tableau vides

function removeEmptyElements(&$element)
{
    if (is_array($element)) {
        if ($key = key($element)) {
            $element[$key] = array_filter($element);
        }

        if (count($element) != count($element, COUNT_RECURSIVE)) {
            $element = array_filter(current($element), __FUNCTION__);
        }

        return $element;
    } else {
        return empty($element) ? false : $element;
    }
}

$data = array(
    'horarios' => array(),
    'grupos' => array(
        '1A' => array(
            'Juan' => array(
                'calificaciones' => array(
                    'Matematicas' => 8,
                    'Español' => 5,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => 10,
                    'marzo' => '',
                )
            ),
            'Damian' => array(
                'calificaciones' => array(
                    'Matematicas' => 10,
                    'Español' => '',
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => '',
                    'marzo' => 5,
                )
            ),
        ),
        '1B' => array(
            'Mariana' => array(
                'calificaciones' => array(
                    'Matematicas' => null,
                    'Español' => 7,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => null,
                    'febrero' => 5,
                    'marzo' => 5,
                )
            ),
        ),
    )
);

$data = array_filter($data, 'removeEmptyElements');
var_dump($data);

Ça marche!

2
iBet7o

essayez ceci ** ** Exemple

$or = array(
        'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
        'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
        'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
        'PersonalInformation.dob' => $this->request->data['User']['dob'],
        'User.email' => $this->request->data['User']['email'],
    );



 $or = array_filter($or);

    $condition = array(
        'User.role' => array('U', 'P'),
        'User.user_status' => array('active', 'lead', 'inactive'),
        'OR' => $or
    );
0
Ashish pathak

Selon votre méthode, vous pouvez simplement attraper ces éléments dans un autre tableau et utiliser celui-ci comme suit:

foreach($linksArray as $link){
   if(!empty($link)){
      $new_arr[] = $link
   }
}

print_r($new_arr);
0
Shahrukh Anwar