빈 배열 요소 제거


783

내 배열의 일부 요소는 사용자가 제출 한 내용에 따라 빈 문자열입니다. 해당 요소를 제거해야합니다. 내가 이거 가지고있어:

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

그러나 작동하지 않습니다. $linksArray여전히 빈 요소가 있습니다. 나는 또한 empty()함수로 그것을 시도 했지만 결과는 동일합니다.


1
unset (...)이 foreach 루프에 의해 생성 된 변수에서 작동하기 때문에 위의 코드가 작동하지 않는다고 언급 할 가치가 있다고 생각했습니다. 원래 배열은 루프 이전과 동일하게 유지되었습니다.
savedario

if (! empty ($ link)) {에코 $ 링크; } 이것은 나를 위해 작동
Shiplu

U는 거부되지 않는 $ link를 변경하고 있습니다! foreach ($ linksArray를 $ key => $ link로 사용) unset (linksArray [$ key])
TD_Nijboer

답변:


1547

문자열 배열을 다룰 때 간단하게 사용할 수 array_filter()있습니다.이 모든 것을 편리하게 처리합니다.

print_r(array_filter($linksArray));

있다는 사실에 유의 콜백이 제공되지 않으면 , 어레이의 모든 항목이 동일 FALSE(참조 논리 값으로 변환 을 제거한다). 따라서 정확한 문자열 '0'인 요소를 유지 해야하는 경우 사용자 정의 콜백이 필요합니다.

// PHP 7.4 and later
print_r(array_filter($linksArray, fn($value) => !is_null($value) && $value !== ''));

// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return !is_null($value) && $value !== ''; }));

// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));

16
array_filter빈 요소를 제거해야합니다. 그리고 비어있는 PHP의 정의가 정의와 완전히 다르면, 원치 않는 요소를 버리는 익명 함수로 콜백 옵션을 채울 수 있습니다. 익명 콜백을 사용하려면 PHP 5.3 이상이 있어야합니다. stackoverflow.com/questions/2412299/…
Buttle Butkus

76
array_filter가 배열 인덱스를 재 인덱싱하지 않음에주의하십시오 (for 문에서 프로세스 배열을 사용할 때 문제점이 발생할 수 있음). 따라서 array_values ​​함수로 모두 감싸십시오.
Michal-wasda-net

8
false요소도 제거되므로 답변이 잘못 되었습니다. ( php.net/manual/en/function.array-filter.php )
pliashkou

5
@Deji 해당 배열을 필터링하기 전에 인쇄 해 보셨습니까? 내가 설정 생각하는 a두 번째 것은 단지 첫 번째를 재설정합니다.
Cullub

5
@Cranio : 이미 다른 의견으로 덮여 있습니다. 정확하지는 않지만 요구 사항 보다 더 넓을 있습니다. 그렇다고 다른 사람들이 여전히 도움이되지 않는다는 의미는 아닙니다. 결국, 배열의 문자열 만 있으면이 답변은 빈 문자열 만 제거합니다.
Martijn Pieters

169

array_filter빈 요소를 제거 하는 데 사용할 수 있습니다 .

$emptyRemoved = array_filter($linksArray);

(int) 0배열에 있다면 다음을 사용할 수 있습니다.

$emptyRemoved = remove_empty($linksArray);

function remove_empty($array) {
  return array_filter($array, '_remove_empty_internal');
}

function _remove_empty_internal($value) {
  return !empty($value) || $value === 0;
}

편집 : 어쩌면 요소가 비어 있지 않지만 하나 이상의 공백이있을 수 있습니다 ... 사용하기 전에 다음을 사용할 수 있습니다array_filter

$trimmedArray = array_map('trim', $linksArray);

10
방금 BoltClock에서 허용되는 답변에 추가했습니다. 단순히 "0"문제를 피하고 길이가 0 인 문제 만 제거하려면 array_filter ($ foo, 'strlen')을 수행하면됩니다.
AB Carroll

2
@nezZario : scalar배열에 항목 만 있다고 가정합니다 . 그렇지 않으면 그렇게 할 수 없습니다.
Andrew Moore

2
PHP> = 5.3에 람다 사용function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
Viral

1
array_map()내가 그 빈 배열에 공백이있는 마술을 했습니까!
프로디지

126

이 주제에 대한 가장 인기있는 답변은 절대적으로 부정확합니다.

다음 PHP 스크립트를 고려하십시오.

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));

왜 이런거야? 단일 '0'문자를 포함하는 문자열도 부울 false로 평가되므로 빈 문자열이 아니더라도 여전히 필터링됩니다. 그것은 버그 일 것입니다.

내장 strlen 함수를 필터링 함수로 전달하면 비어 있지 않은 문자열의 경우 0이 아닌 정수와 빈 문자열의 경우 0이 아닌 정수를 반환하므로 작동합니다. 0이 아닌 정수는 부울로 변환 될 때 항상 true로 평가되는 반면 0이 아닌 정수는 부울로 변환 할 때 항상 false로 평가됩니다.

따라서 절대적이고 결정적인 정답은 다음과 같습니다.

$arr = array_filter($arr, 'strlen');

3
동의했다. 배열에 문자열이 포함 된 경우 허용되는 답변이어야합니다.
mwieczorek

2
공감. 다른 많은 것보다 더 나은 대답이지만, 현재 허용되는 대답은 "빈"은 실제로 PHP 내에서 특별한 의미를 갖기 때문에 기술적으로 부정확하지 않습니다. (자격 일부 값은 "비어": 0, "", null)
rinogo

5
그것들은 틀리지 않습니다. 그것은 맥락에 관한 것입니다. 어떤 경우에는 값 0을 유지하는 것이 중요 할 수 있습니다. 그러니 제발, 당신을 제외한 모든 사람이 틀렸다고 말하지 마십시오
Macr1408

6
어레이에 다른 어레이가 포함 된 경우 중단됩니다.strlen() expects parameter 1 to be string, array given
hpaknia

원하는 행동을 달성하기 위해 다른 사람이 잘못 말하지 않고 좋은 접근 방법이라고 말할 수도 있습니다. 기본적으로 모든 경우가 비슷하지는 않습니다.이 접근 방식은 제 경우에 효과적입니다.
MR_AMDEV

102
$linksArray = array_filter($linksArray);

"콜백이 제공되지 않으면 FALSE와 동일한 입력 항목이 모두 제거됩니다." -http : //php.net/manual/en/function.array-filter.php


4
나는 또한 구글이 문제를 해결 한 후에 이것을 시도했다. 불행히도, 그것은 나를 위해 빈 요소에 남습니다.

18
또한 '0'을 제거합니다
OIS

2
@ 윌 : 확실합니까? 빈 문자열도 제거하고 성공적으로 테스트했습니다. 입력 값에 공백이 포함되어 있으므로 미리 다듬어야합니다. 에 따르면 부울 변환 규칙 빈 문자열은 false로 평가되고, 따라서 array_filter에 의해 제거.
acme

52
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values

strlen은 또한 거짓을 제거합니다 :(
justnorris

42

당신은 할 수 있습니다

array_filter($array)

array_filter : "콜백이 제공되지 않으면 FALSE와 동일한 입력 항목이 모두 제거됩니다." 이는 값이 NULL, 0, '0', '', FALSE, array () 인 요소도 제거됨을 의미합니다.

다른 옵션은

array_diff($array, array(''))

NULL, ''및 FALSE 값을 가진 요소를 제거합니다.

도움이 되었기를 바랍니다 :)

최신 정보

다음은 예입니다.

$a = array(0, '0', NULL, FALSE, '', array());

var_dump(array_filter($a));
// array()

var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());

var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())

요약하면 :

  • 0 또는 '0'은 0과 '0'을 제거합니다.
  • NULL, FALSE 또는 ''는 NULL, FALSE 및 ''를 제거합니다.

36
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 

4
간결한, 제거하지 않습니다 읽을 안전 솔루션 false0. 이것이 승인 된 답변 과 같은 순간 에 게시되었다는 것을 고려할 때 (안전하지 않고 정확하지 않음) 수락 된 답변의 649와 비교하여 8 개의 upvotes만이 한 줄 솔루션이라고 가정 할 수 있습니다.
rybo111

@ rybo111-아마도 콜백에서 그 논리를 사용하여 루프 array_filter()보다 더 깔끔한 접근법 일 것입니다foreach()
Mark Baker

아마도 더 빠를 지 모르지만 솔루션은 가장 읽기 쉬운 것이 중요합니다. 필요로하는 솔루션을 사용하는 사람들을 위해 trim(), 나는 추천 할 것입니다if(is_string($link) && trim($link) === '')
rybo111

33

배열에서 빈 ( ""빈 문자열) 요소를 제거하는 또 하나의 라이너.

$array = array_filter($array, function($a) {return $a !== "";});

참고 :이 코드는 의도적으로 유지 null, 0false요소.


또는 배열 요소를 먼저 다듬고 싶을 수도 있습니다.

$array = array_filter($array, function($a) {
    return trim($a) !== "";
});

참고 :이 코드는 제거 nullfalse요소.


3
정확히 내가 필요로하는 것은 이전 PHP 와 호환됩니다 . 감사합니다! ;-)
Stano

1
@ 존크 잘못. 정확히 콜백에 대한 사용자 whants 같이이 작업을 수행하려면이 됩니다 당신이 alzo 제로 및 기타 falsey 값을 제거하려는 경우가 아니면 필요.
Cranio

아 .. 이건 정말 사랑스러워 받아 들여 져야합니다.
Henrik Petterson

20

한마디로 :

이것은 내가 제안한 코드입니다.

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

설명:

내가 사용하는 생각 array_filter좋지만 값이 같은 수 있기 때문에 충분하지, space그리고 \n... 배열에 보관 이것은 일반적으로 나쁘다.

내가 제안 그래서 당신은 혼합물을 사용 array_filter하고 array_map.

array_map트리밍, array_filter빈 값 제거, 값 strlen유지 0array_values필요한 경우 다시 인덱싱하기위한 것입니다.

견본:

$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");

// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);

// "a"
$new2 = array_filter(array_map('trim', $myarray));

// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');

// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));

var_dump($new1, $new2, $new3, $new4);

결과 :

array(5) {
  [0]=>
" string(1) "
  [1]=>
  string(1) "
"
  [2]=>
  string(2) "
"
  [4]=>
  string(1) " "
  [6]=>
  string(1) "a"
}
array(1) {
  [6]=>
  string(1) "a"
}
array(2) {
  [5]=>
  string(1) "0"
  [6]=>
  string(1) "a"
}
array(2) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "a"
}

온라인 테스트 :

http://phpio.net/s/5yg0



12

OP가 빈 문자열에 대해서만 이야기하기 때문에 가장 많이 투표 된 답변이 잘못 되었거나 적어도 완전히 사실이 아닙니다. 자세한 설명은 다음과 같습니다.

공란 이란 무엇입니까 ?

우선, 우리는 의미가 무엇인지에 동의해야합니다 . 걸러 내야합니까?

  1. 빈 문자열 전용 ( "")?
  2. 엄격하게 거짓 값? ( $element === false)
  3. falsey의 값? (예 : 0, 0.0, "", "0", NULL, array () ...)
  4. PHP의 empty()기능 과 동일 합니까?

값을 어떻게 필터링합니까?

필터링하려면 빈 문자열 만 :

$filtered = array_diff($originalArray, array(""));

엄격하게 잘못된 값만 필터링하려면 콜백 함수를 사용해야 합니다.

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}

콜백은 일부를 제외하고 "falsey"값을 필터링하려는 모든 조합에도 유용합니다. (예를 들어, nullfalse만 등을 필터링하고 0) 만 남겨 둡니다 .

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}

세 번째와 네 번째 경우는 (마지막으로 우리의 목적을 위해) 동일하며 사용하기 위해 모두 기본값입니다.

$filtered = array_filter($originalArray);

2
nulland 을 꺼내고 false싶지만 0을 남기고 싶다면 PHP의 내장 strlen함수를 콜백으로 사용할 수도 있습니다 .
Cullub

10

(문자열) 0의 배열 값을 유지하려면이 작업을 수행해야했습니다.

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});


9

다차원 배열

$data = array_map('array_filter', $data);
$data = array_filter($data);

9
$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);

9
function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}

7

다음 스크립트를 사용하여 배열에서 빈 요소를 제거합니다.

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }

7

루프에 대한 대안을 제공하고 싶습니다 ... 키의 간격을 해결하십시오 ...

필자의 경우 작업이 완료되었을 때 순차 배열 키를 유지하고 싶었습니다 (홀수뿐만 아니라 내가 쳐다 본 것입니다. 홀수 키를 찾기 위해 코드를 설정하는 것은 나에게 연약하고 미래 친화적이지 않은 것으로 보입니다).

나는 다음과 같은 것을 찾고 있었다 : http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

array_filter와 array_slice의 조합은 트릭을 수행합니다.

$example = array_filter($example); $example = array_slice($example,0);

효율성이나 벤치 마크에 대한 아이디어는 없지만 작동합니다.


array_values는 array_slice와 동일한 결과를 가질 것이라고 생각합니다. 나중에 코드를 읽고 수행중인 작업을 이해하는 것이 더 직관적 인 것처럼 보입니다.
arlomedia

6
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");   

foreach ($my as $key => $value) {
    if (is_null($value)) unset($my[$key]);
}

foreach ($my as $key => $value) {
    echo   $key . ':' . $value . '<br>';
} 

산출

1 : 5

2 : 6



5

한 줄만 : 업데이트 (@suther 덕분에) :

$array_without_empty_values = array_filter($array);

두 번째 매개 변수가 필요하지 않습니다. $ clean_array = array_filter ($ dirty_array);
suther

4

array_filter빈 값을 제거 하려면 함수를 사용 하십시오.

$linksArray = array_filter($linksArray);
print_r($linksArray);

빈 문자열 을 제거하려고 합니다. 이는 빈 값과 동일하지 않습니다.
Cranio

4

빈 배열 요소 제거

function removeEmptyElements(&$element)
{
    if (is_array($element)) {
        if ($key = key($element)) {
            $element[$key] = array_filter($element);
        }

        if (count($element) != count($element, COUNT_RECURSIVE)) {
            $element = array_filter(current($element), __FUNCTION__);
        }

        return $element;
    } else {
        return empty($element) ? false : $element;
    }
}

$data = array(
    'horarios' => array(),
    'grupos' => array(
        '1A' => array(
            'Juan' => array(
                'calificaciones' => array(
                    'Matematicas' => 8,
                    'Español' => 5,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => 10,
                    'marzo' => '',
                )
            ),
            'Damian' => array(
                'calificaciones' => array(
                    'Matematicas' => 10,
                    'Español' => '',
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => '',
                    'marzo' => 5,
                )
            ),
        ),
        '1B' => array(
            'Mariana' => array(
                'calificaciones' => array(
                    'Matematicas' => null,
                    'Español' => 7,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => null,
                    'febrero' => 5,
                    'marzo' => 5,
                )
            ),
        ),
    )
);

$data = array_filter($data, 'removeEmptyElements');
var_dump($data);

효과가있다!


3

방법에 따라 다른 배열에서 해당 요소를 포착하고 다음과 같이 사용할 수 있습니다.

foreach($linksArray as $link){
   if(!empty($link)){
      $new_arr[] = $link
   }
}

print_r($new_arr);

1

이것을보십시오 ** ** 예

$or = array(
        'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
        'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
        'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
        'PersonalInformation.dob' => $this->request->data['User']['dob'],
        'User.email' => $this->request->data['User']['email'],
    );



 $or = array_filter($or);

    $condition = array(
        'User.role' => array('U', 'P'),
        'User.user_status' => array('active', 'lead', 'inactive'),
        'OR' => $or
    );

1
이게 뭐야? 다른 관련 답변이 많이 있습니다. 여기에 무엇을 추가하고 있습니까?
Félix Gagnon-Grenier

여기에서 질문이 무엇인지 URL을 확인하십시오 !! / * 빈 배열 요소를 제거하십시오 * /
Ashish pathak

1

여기서 array_walk 가 훨씬 더 적합 하다고 생각 합니다.

$linksArray = array('name', '        ', '  342', '0', 0.0, null, '', false);

array_walk($linksArray, function(&$v, $k) use (&$linksArray){
    $v = trim($v);
    if ($v == '')
        unset($linksArray[$k]);
});
print_r($linksArray);

산출:

Array
(
    [0] => name
    [2] => 342
    [3] => 0
    [4] => 0
)
  • 사용자가 두 개 이상의 공백을 추가하더라도 빈 값이 제거되었는지 확인했습니다.
  • 또한 유효한 값에서 빈 공간을 제거했습니다.

  • 마지막으로 (null), (Boolean False) 및 ( '') 만 빈 문자열로 간주됩니다

에 관해서 False는 AFAIK 사용자가 부울 값을 제출 할 수 없기 때문에, 그것을 제거하는 괜찮습니다.


0

이러한 유형의 것들을 사용하면 원하는 것과 원하지 않는 것을 명시 적으로 나타내는 것이 좋습니다.

array_filter()콜백 이 없는 행동에서 다음 사람이 놀라지 않도록 도와줍니다 . 예를 들어 array_filter()제거 여부를 잊어 버렸기 때문에이 질문에 끝났습니다 NULL. 아래 솔루션을 사용하고 답을 얻었을 때 시간을 낭비했습니다.

또한 논리는 array_filter콜백이 전달되지 않을 때 와 같이 PHP 함수의 동작을 견딜 필요없이 코드를 다른 언어로 복사 할 수 있다는 점에서 언어에 무관합니다 .

내 솔루션에서 무슨 일이 일어나고 있는지 한눈에 알 수 있습니다. 조건을 제거하여 무언가를 유지하거나 새 조건을 추가하여 추가 값을 필터링하십시오.

array_filter()사용자 정의 콜백을 전달하기 때문에 실제 사용을 무시하십시오 . 원한다면 원하는 기능으로 추출 할 수 있습니다. foreach루프에 설탕으로 사용하고 있습니다.

<?php

$xs = [0, 1, 2, 3, "0", "", false, null];

$xs = array_filter($xs, function($x) {
    if ($x === null) { return false; }
    if ($x === false) { return false; }
    if ($x === "") { return false; }
    if ($x === "0") { return false; }
    return true;
});

$xs = array_values($xs); // reindex array   

echo "<pre>";
var_export($xs);

이 접근 방식의 또 다른 이점은 필터링 조건자를 배열 당 단일 값을 필터링하고 컴포저 블 솔루션으로 구축하는 추상 함수로 분리 할 수 ​​있다는 것입니다.

이 예제와 출력에 대한 인라인 주석을 참조하십시오.

<?php

/**
 * @param string $valueToFilter
 *
 * @return \Closure A function that expects a 1d array and returns an array
 *                  filtered of values matching $valueToFilter.
 */
function filterValue($valueToFilter)
{
    return function($xs) use ($valueToFilter) {
        return array_filter($xs, function($x) use ($valueToFilter) {
            return $x !== $valueToFilter;
        });
    };
}

// partially applied functions that each expect a 1d array of values
$filterNull = filterValue(null);
$filterFalse = filterValue(false);
$filterZeroString = filterValue("0");
$filterEmptyString = filterValue("");

$xs = [0, 1, 2, 3, null, false, "0", ""];

$xs = $filterNull($xs);        //=> [0, 1, 2, 3, false, "0", ""]
$xs = $filterFalse($xs);       //=> [0, 1, 2, 3, "0", ""]
$xs = $filterZeroString($xs);  //=> [0, 1, 2, 3, ""]
$xs = $filterEmptyString($xs); //=> [0, 1, 2, 3]

echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]

이제 부분적으로 적용된 기능을 적용하는 filterer()using 이라는 함수를 동적으로 만들 수 pipe()있습니다.

<?php

/**
 * Supply between 1..n functions each with an arity of 1 (that is, accepts
 * one and only one argument). Versions prior to php 5.6 do not have the
 * variadic operator `...` and as such require the use of `func_get_args()` to
 * obtain the comma-delimited list of expressions provided via the argument
 * list on function call.
 *
 * Example - Call the function `pipe()` like:
 *
 *   pipe ($addOne, $multiplyByTwo);
 *
 * @return closure
 */
function pipe()
{
    $functions = func_get_args(); // an array of callable functions [$addOne, $multiplyByTwo]
    return function ($initialAccumulator) use ($functions) { // return a function with an arity of 1
        return array_reduce( // chain the supplied `$arg` value through each function in the list of functions
            $functions, // an array of functions to reduce over the supplied `$arg` value
            function ($accumulator, $currFn) { // the reducer (a reducing function)
                return $currFn($accumulator);
            },
            $initialAccumulator
        );
    };
}

/**
 * @param string $valueToFilter
 *
 * @return \Closure A function that expects a 1d array and returns an array
 *                  filtered of values matching $valueToFilter.
 */
function filterValue($valueToFilter)
{
    return function($xs) use ($valueToFilter) {
        return array_filter($xs, function($x) use ($valueToFilter) {
            return $x !== $valueToFilter;
        });
    };
}

$filterer = pipe(
    filterValue(null),
    filterValue(false),
    filterValue("0"),
    filterValue("")
);

$xs = [0, 1, 2, 3, null, false, "0", ""];
$xs = $filterer($xs);

echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.