108 votes

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

Les join() Perl ignorent (ignorent) les valeurs de tableau vides; PHP implode() 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é?

230voto

Felix Kling Points 247451

Vous pouvez utiliser array_filter():

Si aucun rappel est fourni, toutes les entrées d' entrée égale à FALSE (voir la conversion en booléen) seront supprimés.

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

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

9voto

Ben Points 4744

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'));
 

3voto

Thomas Hupkens Points 953

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"));
} 
 

1voto

Sir mXe Points 122

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;
}
 

1voto

Jeremy Points 376

Essaye ça:

 $result = array();

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

implode('-', $result);
 

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