배열 요소를 제거한 다음 배열을 다시 색인하는 방법?


206

배열에 문제가 있습니다. 아래와 같이 수정하려는 배열이 하나 있습니다. 인덱스로 요소 (요소)를 제거한 다음 배열을 다시 인덱싱하고 싶습니다. 가능합니까?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

답변:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

6
이것이 바로 내가 게시하고 싶은 내용입니다 (+1).
Michiel Pater

4
여러 항목을 한 번에 제거해야하는 경우 (해당 항목의 색인을 미리 수집 한 경우) deceze 솔루션보다 낫습니다. 첫 번째 항목에서 array_splice를 사용하면 나머지 항목의 인덱스가 손실됩니다.
Jānis Elmeris

23
단일 unset 호출에서 여러 변수 / 배열 인덱스를 설정 해제 할 수 있다는 점에 주목할 가치가 있습니다.unset($foo[0], $foo[3], $bar[1]);
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

아주 좋은 솔루션 형제 :
마이클 Kisilenko

나는 이것을 사용했다. 감사합니다. 나는을 사용 array_splice하고 있었고, 0과 1 인덱스에서는 작동하지 않았다.
theGreenCabbage


29

당신은 더 잘 사용 array_shift()합니다. 배열의 첫 번째 요소를 반환하고 배열에서 제거한 다음 배열을 다시 인덱싱합니다. 하나의 효율적인 방법으로


2
프로세스에서 배열을 다시 인덱싱하여 첫 번째 배열 요소를 검색 한 다음 제거 할 때 좋습니다. 대응 함수 array_pop()는 필요한 경우 마지막 배열 요소를 검색하고 제거합니다. 그러나 배열 중간에있는 요소에 대해 어떤 기능도 수행 할 수는 없습니다.
데릭 밀러

1
이것은 직교 적으로 관련되어 있지만 첫 번째 문제뿐만 아니라 배열의 모든 요소에 대한 문제입니다 .
Félix Gagnon-Grenier


9
Unset($array[0]); 

Sort($array); 

왜 이것이 다운 보트인지는 모르겠지만, 누군가 시도해보고 싶을 경우, 작동한다는 것을 알게 될 것입니다. 배열에서 정렬을 사용하면 배열의 키가 다시 할당됩니다. 유일한 단점은 값을 정렬한다는 것입니다. 키를 사용해도 키가 재 할당 array_values되므로 값이 정렬되는지 여부는 중요하지 않습니다.


9
키가 재 할당 되더라도 정답으로 초기 순서가 유지됩니다.
s3v3n

1
"인덱스로 요소 (요소)를 제거한 다음 배열을 다시 인덱싱하고 싶습니다. 가능합니까?" @ s3v3n OP가 초기 주문 유지를 요청하지 않았습니다. 나는 단순히 작동하고 명시된 것을 수행하는 솔루션을 제공했습니다.
frostymarvelous

1
문제는 2 살입니다. 놓아주세요!
s3v3n

@ s3v3n 원한이 아닙니다. 이유를 알고 싶습니다. 나중에 답변을 개선하기 위해 분명히. 더 나은 방법이 있지만 동의하지 않는 이유가 있습니까? 성능입니까? 기타? 배우고 가르치기 위해 내가 그렇게하는 이유도 마찬가지입니다.
frostymarvelous

정상적인 상황에서는 프로그래머가 입력 값과 정확히 동일한 순서로 해당 값을 필요로 할 가능성이 큽니다. 테이블에 표시되어야하는 데이터베이스의 일부 행을 예로 들어 보겠습니다. 답글이 정확히 같은 순서로 있어야하는 채팅 응용 프로그램. 예제의 수는 무한 할 수 있습니다. 요점은 대부분의 경우 순서는 동일하거나 최소한 프로그래머는 배열의 요소와 동일한 순서를 기대해야한다는 것입니다.
s3v3n

4

시도해보십시오 :

$foo2 = array_slice($foo, 1);

이것은 임의의 요소가 아닌 첫 번째 요소에서만 작동합니다.
Felix Kling

0

xzyfer의 답변 외에도

함수

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

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

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

사용하다

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

결과

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.