111

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

配列があるとします。

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

収量:

one---four--six

(IMHOが望ましい)の代わりに:

one-four-six

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

4

9 に答える 9

233

あなたが使用することができますarray_filter()

コールバックが指定されていない場合、(ブール値への変換を参照)に等しい入力のすべてのエントリが削除されます。FALSE

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

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

于 2011-05-12T22:52:55.160 に答える
9

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

function rempty ($var)
{
    return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));
于 2011-05-12T22:53:29.407 に答える
4

null、、文字列を削除falseemptyて保存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 )
于 2018-04-05T14:48:07.267 に答える
3

フィルタをどのように実装するかは、「空」と見なされるものにのみ依存します。

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"));
} 
于 2011-05-12T23:10:13.610 に答える
2
$array = ["one", NULL, "two", NULL, "three"];
$string = implode("-", array_diff($array, [NULL]));
echo $string;

戻り値one-two-three

于 2020-06-29T00:38:46.797 に答える
1

私が見つけたものに基づいて、私はチャンスがあると思います、そのために組み込まれた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;
}
于 2011-05-12T22:56:05.397 に答える
1

これを試して:

$result = array();

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

implode('-', $result);
于 2011-05-12T22:56:52.780 に答える
-1

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

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

$array = array('one', '', '', 'four', '', 'six');
$str   = implode('-', $array);
$str   = preg_replace ('/(-)+/', '\1', $str);
于 2017-11-04T13:05:03.227 に答える
-3

これを試して:

if(isset($array))  $array = implode(",", (array)$array);
于 2013-12-02T08:00:41.790 に答える