Как я могу взорвать массив, пропуская пустые элементы массива? - PullRequest
86 голосов
/ 13 мая 2011

Perl's join() игнорирует (пропускает) пустые значения массива;PHP implode() не отображается в.

Предположим, у меня есть массив:

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

выход:

one---four--six

вместо (IMHO предпочтительнее):

one-four-six

Любые другие встроенные функции с поведением, которое я ищу?Или это будет заказная работа?

Ответы [ 8 ]

188 голосов
/ 13 мая 2011

Вы можете использовать array_filter():

Если не указан обратный вызов , все записи input , равные FALSE (см. преобразование в логическое значение ), будут удален.

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

Очевидно, что это не будет работать, если у вас есть 0 (или любое другое значение, которое оценивается как false) в вашем массиве, и вы хотите сохранить его. Но тогда вы можете предоставить свою собственную функцию обратного вызова.

8 голосов
/ 13 мая 2011

Полагаю, вы не можете считать его встроенным (поскольку функция работает с определенной пользователем функцией), но вы всегда можете использовать array_filter .
Что-то вроде:

function rempty ($var)
{
    return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));
3 голосов
/ 13 мая 2011

Способ применения фильтра зависит только от того, что вы видите как «пустой».

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"));
} 
2 голосов
/ 05 апреля 2018

Чтобы удалить строки 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 )
1 голос
/ 13 мая 2011

Попробуйте это:

$result = array();

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

implode('-', $result);
1 голос
/ 13 мая 2011

Основываясь на том, что я могу найти, я бы сказал, что на самом деле нет никакого способа использовать встроенный 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;
}
0 голосов
/ 04 ноября 2017

array_fileter() кажется приемлемым здесь, и, вероятно, все еще самый надежный ответ.

Тем не менее, следующее также будет работать, если вы можете гарантировать, что «клейкий» символ еще не существует в строках каждого элемента массива (что было бы задано в большинстве практических обстоятельств - иначе вы бы этого не сделали) возможность отличить клей от фактических данных в массиве):

$array = array('one', '', '', 'four', '', 'six');
$str   = implode('-', $array);
$str   = preg_replace ('/(-)+/', '\1', $str);
0 голосов
/ 02 декабря 2013

Попробуйте это:

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