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é?
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.
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'));
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"));
}
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 )
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;
}
Essaye ça:
$result = array();
foreach($array as $row) {
if ($row != '') {
array_Push($result, $row);
}
}
implode('-', $result);
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);