array_filter () 후 0부터 숫자 순서대로 키를 재설정하려면 어떻게해야합니까?


108

방금 array_filter를 사용하여 배열에서 ''값만있는 항목을 제거했으며 이제 0부터 시작하는 자리 표시 자에 따라 특정 변환을 적용하려고하지만 불행히도 원래 인덱스는 그대로 유지됩니다. 나는 잠시 동안 보니 아무것도 볼 수 없었습니다. 아마도 나는 명백한 것을 놓쳤을 것입니다. 그러나 제 질문은 ...

이전 인덱스를 유지하지 않고 0에서 시작하여 새 배열에서 순서대로 배열의 인덱스를 쉽게 재설정 할 수있는 방법은 무엇입니까?



당신이 당신의 배열에 비어있는 / 제로-이시 / 거짓 값이 없다는 것을 절대적으로 확신하지 않는 한, 나는 당신이 사용하지 말 것을 촉구합니다. array_filter()당신은 당신이 의도 한 것보다 더 많이 제거 할 수 있습니다. 여기에 데모 몇 가지 설명입니다 : stackoverflow.com/a/43657056/2943403
mickmackusa은

답변:



37

배열 필터를 사용하는 경우 다음과 같이 수행하십시오.

$NewArray = array_values(array_filter($OldArray));

3
오, 내가 왜 json_encode 배열의 결과가 json_encode an array_filtered 배열의 결과와 다른지 알아 내려고하면서 잃어 버렸다 ... 감사합니다 ...
Jerther

13

얼마나 많은 프로그래머가 array_values(array_filter())자신의 코드에 메소드를 복사 / 붙여 넣었는지 걱정합니다. 얼마나 많은 프로그래머가 array_filter의 탐욕 때문에 무의식적으로 문제를 겪었는지 궁금합니다. 더 나쁜 것은 얼마나 많은 사람들이이 함수가 배열에서 너무 많은 값을 제거한다는 사실을 발견하지 못한 것입니다.

NULL배열에서 요소를 제거 하고 키를 다시 인덱싱하는 두 부분으로 구성된 프로세스에 대한 더 나은 대안을 제시하겠습니다 .

그러나 먼저 욕심 많은 성격 array_filter()과 이것이 당신의 프로젝트를 조용히 망치는 방법을 강조하는 것이 매우 중요합니다 . 다음은 문제를 노출 할 혼합 값이있는 배열입니다.

$array=['foo',NULL,'bar',0,false,null,'0',''];

대문자 / 소문자에 관계없이 Null 값이 제거됩니다.

그러나 array_values ​​() & array_filter ()를 사용할 때 배열에 무엇이 남아 있는지 살펴보십시오 .

array_values(array_filter($array));

출력 배열 ($ array) :

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!

이제 array_walk ()is_null () 을 사용하여 새 필터링 된 배열을 생성하는 내 메서드로 얻은 결과를 살펴보십시오 .

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});

더 쉽게 읽고 설명하기 위해 여러 줄에 걸쳐 작성할 수 있습니다.

array_walk(                      // iterate each element of an input array
    $array,                      // this is the input array
    function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
        if(!is_null($v)){        // this literally checks for null values
            $filtered[]=$v;      // value is pushed into output with new indexes
        }
    }
);

출력 배열 ($ filter) :

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

내 방법을 사용하면 다시 인덱싱 된 키, 모든 비 null 값 및 null 값 없음을 얻을 수 있습니다. 모든 어레이 널 필터링 요구 사항을 충족하는 깨끗하고 휴대 가능하며 신뢰할 수있는 원 라이너입니다. 다음은 데모 입니다.



마찬가지로, 빈, 거짓 및 null 요소 (0 유지)를 제거하려는 경우 다음 네 가지 메서드가 작동합니다.

var_export(array_values(array_diff($array,[''])));

또는

var_export(array_values(array_diff($array,[null])));

또는

var_export(array_values(array_diff($array,[false])));

또는

var_export(array_values(array_filter($array,'strlen')));

산출:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)

마지막으로, 언어 구문의 구문을 선호하는 사람이라면 한정 값을 새 배열에 밀어 넣어 새 인덱스를 발행 할 수도 있습니다.

$array=['foo', NULL, 'bar', 0, false, null, '0', ''];

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);

2
작성하면 예상대로 작동하지 array_values(array_filter($arr, function($el) {return $el !== '';}))않습니까? 그것은 OP가 요구하는 것을하는 자연스러운 방법 인 것 같습니다.
Casey

1
예. 내 요점은 개발자가 array_filter()데이터에 대한 친밀한 지식이 부작용없이 탐욕스러운 필터링을 허용하지 않는 한 기본 동작을 사용하려는 충동을 피해야한다는 것입니다. (A 더욱주의 : empty()이 동일한 방식으로 동작하고는 탐욕에 빈 어레이를 포함한다.)
mickmackusa

2
이 답변은 완전히 다른 질문에 대한 답변이며, 어떤 식 으로든, 모양이나 형식에 관계없이 원래 질문과 관련이 없습니다.
AnrDaemon 2018

1
array_filter()정확히 같은 동작합니다은 (는) 설명서에 말씀에 따라 기대 : php.net/manual/en/function.array-filter.php 콜백가 제공되지 않는 경우, 배열의 모든 항목이 FALSE로 동일 "(부울로 변환 참조 )이 제거됩니다. " 그리고 0, null, false, ''및 '0'이 부울로 강제 변환 될 때 모두 false로 평가된다는 것은 PHP 프로그래머 사이에서 상식이어야합니다.
매드슨

1
대부분의 사람들은 무엇을 기대해야할지 모릅니다. 당신은 그렇습니다.하지만 많은 사람들은 그렇지 않습니다. 모르는 사람들을 돕기 위해이 답변을 게시했습니다.
mickmackusa

12

사용 array_values():

<?php

$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
    return $var !== 'bar';
});

print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.