如何在跳过空数组项时内爆数组?

时间:2011-05-12 22:49:46

标签: php implode

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

假设我有一个数组:

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

的产率:

one---four--six

而不是(恕我直言):

one-four-six

我正在寻找的任何其他内置插件?或者它会成为一个自定义的职业?

9 个答案:

答案 0 :(得分:182)

您可以使用array_filter()

  

如果未提供回调,则输入的所有条目等于 FALSE (请参阅converting to boolean)被删除。

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

显然,如果你的数组中有0(或任何其他值为false的值)并且你想保留它,那么这将不起作用。但是你可以提供自己的回调功能。

答案 1 :(得分:8)

我认为您无法考虑内置(因为该功能是使用用户定义的函数运行的),但您始终可以使用array_filter。 类似的东西:

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

答案 2 :(得分: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"));
} 

答案 3 :(得分:2)

要删除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 )

答案 4 :(得分: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;
}

答案 5 :(得分:1)

试试这个:

$result = array();

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

implode('-', $result);

答案 6 :(得分:1)

$array = ["one", NULL, "two", NULL, "three"];
$string = implode("-", array_diff($array, [NULL]));
echo $string;

返回one-two-three

答案 7 :(得分:0)

array_fileter()似乎是可接受的方式,并且可能仍然是最强大的答案。

但是,如果您可以保证每个数组元素的字符串中不存在“粘合”字符,那么以下内容也会起作用(在大多数实际情况下这将是给定的 - 否则您将不会能够区分胶水与阵列中的实际数据):

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

答案 8 :(得分:-3)

试试这个:

if(isset($array))  $array = implode(",", (array)$array);