빈 배열 항목을 건너 뛰면서 배열을 내파하려면 어떻게해야합니까?


94

Perl join()은 빈 배열 값을 무시 (건너 뛰기)합니다. PHP는 implode()보이지 않습니다.

배열이 있다고 가정합니다.

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

수율 :

one---four--six

대신 (IMHO 선호) :

one-four-six

내가 찾고있는 동작이있는 다른 내장 기능이 있습니까? 아니면 맞춤형 직업이 될까요?


2
Perl의 행동에 대해 틀 렸습니다. join정의되지 않은 요소를 건너 뛰지 않습니다. 사실, 경고가 발생합니다. $a[0]="a"; $a[2]="c"; say join "-",@a;디스플레이 Use of uninitialized value within @a in join or stringa--c. join '-', grep !defined, ...정의되지 않은 값을 건너 뛰는 데 사용할 수 있습니다 . grep !length,빈 문자열을 수행합니다.
ikegami

답변:


210

다음을 사용할 수 있습니다 array_filter().

어떠한 경우 콜백이 제공되지 않으며, 모든 항목의 입력은 동일 FALSE(참조 부울로 변환 제거한다).

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

배열에 0(또는로 평가되는 다른 값 false)이 있고 유지하려는 경우 분명히 작동하지 않습니다 . 그러나 그런 다음 자체 콜백 함수를 제공 할 수 있습니다.


5
그것은 false, 그리고 0또한 버려지는 것을 의미 합니까?
Ben

1
@maz : 예,하지만 언제든지 자체 콜백을 제공 할 수 있습니다. empty당신이 그것을 사용할 때, 또한 취급 0false같은 falseBTW (및 제거).
Felix Kling

3
하나는하지만, 언급 한되어야 array_filter()기본 모든 오프 필터에 의해 false, null빈 문자열 ( '')와 0.
Tadeck

1
@Tadeck : 예, 견적에있는 링크를 따라 가십시오. 더 많은 값은 false빈 배열 0.0"0".
Felix Kling

@Felix : 알았어요-PHP를 처음 사용하는 사람들에게 강조하고 싶었습니다.) 어쨌든 : 감사합니다
Tadeck

9

함수가 사용자 정의 함수로 실행되기 때문에 내장 된 것으로 간주 할 수 없다고 가정하지만 항상 array_filter를 사용할 수 있습니다 .
다음과 같은 것 :

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

1
을 사용하면 empty콜백을 전혀 전달하지 않는 것과 같은 효과가 있습니다. 편집 : 반환 값을 부정해야합니다. 그렇지 않으면 빈 요소 만 반환됩니다.) (실제로 empty이전에했던 것처럼 사용 하는 것도 잘못되었습니다)
Felix Kling

1
네, 거꾸로군요. 하지만 당신은 나에게 올바른 아이디어를 주셨습니다implode('-', array_filter($ary, create_function('$a', 'return $a!="";')));
Tom Auger

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

,, 문자열 을 제거 null하고 보존 하려면 func를 사용하십시오. ' 'falseempty0strlen

$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

내가 찾을 수있는 것을 바탕으로, 나는 그것을 위해 내장 된 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;
}

1

이 시도:

$result = array();

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

implode('-', $result);

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

보고 one-two-three


-1

array_fileter() 여기에서 받아 들여지는 방법으로 보이며 아마도 여전히 가장 강력한 대답 tbh 일 것입니다.

그러나 "glue"문자가 각 배열 요소의 문자열에 이미 존재하지 않는다는 것을 보장 할 수있는 경우 다음도 작동합니다 (가장 실제적인 상황에서 제공됩니다. 그렇지 않으면 구별 할 수 없습니다). 배열의 실제 데이터에서 얻은 접착제) :

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

-3

이 시도:

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

경고를 방지하기 위해 isset ()을 사용할 수 있습니다.
user2775080

원본 게시물의 문제를 해결하기 isset()위해 입력 배열을 어떻게 또는 캐스팅 하는지 잘 모르겠습니다 array.
Tom Auger

1
이것은 해결책이 아닙니다. (배열)로 캐스팅해도 배열에서 빈 항목이 제거되지 않습니다.
mjwunderlich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.