Как я могу взорвать массив, пропуская пустые элементы массива?

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

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

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

дает:

one---four--six

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

one-four-six

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 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"));
} 

Ответ 4

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

Попробуйте следующее:

$result = array();

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

implode('-', $result);

Ответ 6

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

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

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

Ответ 7

Попробуйте следующее:

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