Perlのjoin()
は空の配列値を無視(スキップ)します。 PHPのimplode()
は表示されません。
私は配列を持っているとします:
$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);
収量:
one---four--six
代わりに(私見が望ましい):
one-four-six
私が探している動作を持つ他のビルトインはありますか?それとも、カスタムジョブビーになるのでしょうか?
array_filter()
を使用できます。
callbackが指定されていない場合、inputのすべてのエントリは
FALSE
に等しい( を参照) boolean )への変換は削除されます。
implode('-', array_filter($array));
配列に0
(またはfalse
と評価されるその他の値)があり、それを保持したい場合、これは明らかに機能しません。ただし、独自のコールバック関数を提供できます。
(ユーザー定義関数を使用して関数が実行されているため)組み込みと見なすことはできませんが、常に array_filter を使用できます。
何かのようなもの:
function rempty ($var)
{
return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));
フィルターの実装方法は、「空」と見なされるものにのみ依存します。
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"));
}
null
、false
、empty
文字列を削除するが、0
など。funcを使用します。 'strlen
'
$arr = [null, false, "", 0, "0", "1", "2", "false"];
print_r(array_filter($arr, 'strlen'));
出力されます:
//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )
私が見つけることができるものに基づいて、私はチャンスがあると思います、PHPはそのために組み込まれています。しかし、あなたはおそらくこれに沿って何かをすることができます:
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;
}
これを試して:
$result = array();
foreach($array as $row) {
if ($row != '') {
array_Push($result, $row);
}
}
implode('-', $result);
array_fileter()
はここで受け入れられているようであり、おそらく最も堅牢な答えです。
ただし、各配列要素の文字列に「接着剤」文字が既に存在しないことを保証できる場合は、以下も機能します(ほとんどの実際的な状況で与えられます-そうでない場合は区別できません)配列内の実際のデータからの接着剤):
$array = array('one', '', '', 'four', '', 'six');
$str = implode('-', $array);
$str = preg_replace ('/(-)+/', '\1', $str);