web-dev-qa-db-fra.com

Comment puis-je imploser un tableau en ignorant les éléments de tableau vides?

join() de Perl ignore (ignore) les valeurs de tableau vides; implode() de PHP ne semble pas à.

Supposons que j'ai un tableau:

$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);

rendements:

one---four--six

au lieu de (IMHO le préférable):

one-four-six

Avez-vous d'autres comportements intégrés au comportement que je recherche? Ou est-ce que ça va être un jobbie personnalisé?

81
Tom Auger

Vous pouvez utiliser array_filter() :

Si aucun rappel n'est fourni, toutes les entrées de entrée égales à FALSE (voir conversion en boolean ) seront supprimées. 

implode('-', array_filter($array));

Évidemment, cela ne fonctionnera pas si vous avez 0 (ou toute autre valeur ayant la valeur false) dans votre tableau et que vous souhaitez le conserver. Mais vous pouvez alors fournir votre propre fonction de rappel.

175
Felix Kling

Je suppose que vous ne pouvez pas la considérer comme intégrée (car la fonction est exécutée avec une fonction définie par l'utilisateur), mais vous pouvez toujours utiliser array_filter .
Quelque chose comme:

function rempty ($var)
{
    return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));
8
Ben

La manière dont vous devriez implémenter votre filtre dépend uniquement de ce que vous voyez comme "vide".

function my_filter($item)
{
    return !empty($item); // Will discard 0, 0.0, '0', '', NULL, array() of FALSE
    // Or...
    return !is_null($item); // Will only discard NULL
    // or...
    return $item != "" && $item !== NULL; // Discards empty strings and NULL
    // or... whatever test you feel like doing
}

function my_join($array)
{
    return implode('-',array_filter($array,"my_filter"));
} 
3
Thomas Hupkens

Pour supprimer null, false, empty chaîne mais conserver 0, etc., utilisez func. 'strlen'

$arr = [null, false, "", 0, "0", "1", "2", "false"];
print_r(array_filter($arr, 'strlen'));

affichera:

//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )
2
Ali Varli

Sur la base de ce que je peux trouver, je dirais que les chances sont, il n'y a vraiment aucun moyen d'utiliser un PHP construit pour cela. Mais vous pourriez probablement faire quelque chose dans le sens de ceci:

function implode_skip_empty($glue,$arr) {
      $ret = "";
      $len = sizeof($arr);
      for($i=0;$i<$len;$i++) {
          $val = $arr[$i];    
          if($val == "") {
              continue;
          } else {
            $ret .= $arr.($i+1==$len)?"":$glue;
          }
      }
      return $ret;
}
1
ozzmotik

Essaye ça:

$result = array();

foreach($array as $row) { 
   if ($row != '') {
   array_Push($result, $row); 
   }
}

implode('-', $result);
1
Jeremy

array_fileter() semble être le moyen accepté ici, et reste probablement la réponse la plus robuste tbh.

Cependant, ce qui suit fonctionnera également si vous pouvez garantir que le caractère "collé" n'existe pas déjà dans les chaînes de caractères de chaque élément du tableau (ce qui serait normal dans la plupart des cas pratiques - sinon vous ne pourriez pas distinguer la colle des données réelles dans le tableau):

$array = array('one', '', '', 'four', '', 'six');
$str   = implode('-', $array);
$str   = preg_replace ('/(-)+/', '\1', $str);
0
cartbeforehorse