111

Perljoin()忽略(跳过)空数组值;PHP的implode()似乎没有。

假设我有一个数组:

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

产量:

one---four--six

而不是(恕我直言,更可取):

one-four-six

任何其他具有我正在寻找的行为的内置插件?或者它会成为一个定制的工作人员?

4

9 回答 9

233

您可以使用array_filter()

如果没有提供回调,则所有等于(请参阅转换为 boolean )的输入条目都将被删除。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, false, emptystring 但保留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 回答