web-dev-qa-db-ja.com

空の配列項目をスキップしながら配列を分解するにはどうすればよいですか?

Perlのjoin()は空の配列値を無視(スキップ)します。 PHPのimplode()は表示されません。

私は配列を持っているとします:

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

収量:

one---four--six

代わりに(私見が望ましい):

one-four-six

私が探している動作を持つ他のビルトインはありますか?それとも、カスタムジョブビーになるのでしょうか?

86
Tom Auger

array_filter() を使用できます。

callbackが指定されていない場合、inputのすべてのエントリはFALSEに等しい( を参照) boolean )への変換は削除されます。

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

配列に0(またはfalseと評価されるその他の値)があり、それを保持したい場合、これは明らかに機能しません。ただし、独自のコールバック関数を提供できます。

189
Felix Kling

(ユーザー定義関数を使用して関数が実行されているため)組み込みと見なすことはできませんが、常に array_filter を使用できます。
何かのようなもの:

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

フィルターの実装方法は、「空」と見なされるものにのみ依存します。

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

nullfalseempty文字列を削除するが、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 )
2
Ali Varli

私が見つけることができるものに基づいて、私はチャンスがあると思います、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;
}
1
ozzmotik

これを試して:

$result = array();

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

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

array_fileter()はここで受け入れられているようであり、おそらく最も堅牢な答えです。

ただし、各配列要素の文字列に「接着剤」文字が既に存在しないことを保証できる場合は、以下も機能します(ほとんどの実際的な状況で与えられます-そうでない場合は区別できません)配列内の実際のデータからの接着剤):

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