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

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

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



답변

array_values배열 을 호출하면 0부터 다시 인덱싱됩니다.


답변

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

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


답변

얼마나 많은 프로그래머가 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);


답변

사용 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


답변