PHP : 배열에서 특정 요소를 제거하는 방법?


160

요소 이름을 알 때 배열에서 요소를 어떻게 제거합니까? 예를 들면 다음과 같습니다.

배열이 있습니다.

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

사용자가 입력 strawberry

strawberry 제거됩니다.

충분히 설명하려면 :

쉼표로 구분 된 항목 목록을 저장하는 데이터베이스가 있습니다. 코드는 해당 선택이있는 사용자 선택에 따라 목록을 가져옵니다. 따라서 딸기를 선택하면 모든 항목의 코드 풀이 딸기가 있고 split ()을 사용하여 배열로 변환합니다. 배열에서 사용자가 선택한 항목 (예 : 딸기)을 제거하고 싶습니다.




답변:


296

사용 array_search키를 얻고 그것을 제거 unset발견하는 경우 :

if (($key = array_search('strawberry', $array)) !== false) {
    unset($array[$key]);
}

array_search항목을 찾지 못하면 false를 반환합니다 ( PHP 4.2.0까지 null ).

동일한 값을 가진 여러 항목이있을 수 있으면 array_keys모든 항목의 키를 얻는 데 사용할 수 있습니다 .

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}

이상한 결과를 얻습니다. 항상 하나의 인스턴스 만 있기 때문에 첫 번째 제안을 사용했습니다. 그것을 테스트하기 위해 단순히 키 값을 출력했습니다. 일했다. 그러나 설정되지 않습니다.
dcp3450

1
while (odbc_fetch_row ($ runqueryGetSubmenus)) {$ submenuList = odbc_result ($ runqueryGetSubmenus, "하위 메뉴"); $ submenuArray = split ( ',', $ submenuList); if (($ key = array_search ($ name, $ submenuArray))! == false) {unset ($ submenuArray [$ key]); }}
dcp3450

@ dcp3450 : 그리고 당신은 무엇을 $submenuArray합니까? (각 루프마다 $submenuArray덮어 씁니다.)
Gumbo

더 잘 설명하기 위해 내 질문을 업데이트했습니다. 기본적으로 코드는이 예제에서 "strawberry"라는 선택된 항목을 제거하여 데이터베이스의 항목을 반복합니다. 따라서 사용자는 선택 사항을 입력하고 => 코드는 하위 메뉴에서 검색하고 해당 옵션이있는 목록을 찾습니다 => 해당 목록을 배열로 바꿉니다 => 선택한 옵션을 제거합니다.
dcp3450

1
알았습니다! 새 어레이를 다시 DB에 다시 쓰지 않았습니다. 오랫동안 코드를 응시할 때 쉽게 놓칠 수 있습니다.
dcp3450

153

사용 array_diff()1 개 라인 솔루션 :

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

... 추가 기능이나 foreach 루프가 필요하지 않습니다.


8
이 솔루션은 상위 솔루션보다 훨씬 읽기 쉽습니다.
Robbert

경우가 있지만 strawberry초기 배열에없는, 그것은에서 사용할 수있게됩니다 $array_without_strawberries배열 - 위험한 코드 주어진 요소가 배열에 있지 않은지 확인하십시오.
Erfan

5
@Erfan 귀하의 주장이 잘못되었습니다. $a = array_diff(array(), array('strawberry'));-$ a는 빈 배열입니다.
bancer 2016 년

1
당신은 맞습니다 @bancer-아마도 array_intersect 또는 무언가를 생각하고 있었을 것입니다.
Erfan

1
array_diff ()는 표시된 답변보다 우아합니다.
Dom DaFonte

36
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}

2
딸기 가 배열에 있는지 테스트해야 합니다.
Gumbo

Gumbo의 조언에 따라 배열에서 요소를 제거하기 전에 요소의 검증을 포함하도록 답변을 수정했습니다.
John Conde

2
또한 특정 요소를 삭제 한 후에는 인덱스가 다시 정렬되지 않습니다. 다시 말해, 인덱스 시퀀스에는 틈이 생깁니다. 예제에서 'strawberry'를 삭제해도 'kiwi'에는 여전히 색인 4가 있으며 색인 2는 단순히 사라집니다. for ($ i = 0; $ i <.., $ i ++) 루프와 같이 코드가 인덱스 시퀀스의 완전성에 의존하는지 여부는 중요합니다.
바나나 킹

2
바나나 왕이 말한 것에 추가하려면 배열을 다시 색인화하려면 간단히 수행하십시오 $my_array = array_values($my_array);.
ryeguy

2
이 솔루션은 정확하지만 어레이 TWICE ( in_arrayarray_search)를 검색합니다 . array_searchGumbo의 답변에서 와 같이 리턴을 사용하는 것이 더 효과적입니다.
Bogdan D

21

여기에 일반 배열을 사용하는 경우 (이 경우처럼) 대신이 코드를 사용해야합니다.

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) 요소 만 제거하고 일반 배열의 순서를 바꾸지 않습니다.

아마도 우리는 배열을 가지고 array_splice를 사용합니다 :

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

설정 해제와 비교 ​​:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

unset($array[$key])배열의 순서를 바꾸지 않는 방법에 주목 하십시오.


공식적으로 unset아무것도 반환하지 않습니다. 따라서 json_encode(unset($array[2]))비교에 적합하지 않습니다.
robsch

이것은 정확히 내가 필요한 것입니다, ericluwj에 탁월
ana

12

배열 필터를 사용하여 $v다음 조건에 따라 항목을 제거 할 수 있습니다 .

$arr = array_filter($arr, function($v){
    return $v != 'some_value';
});

공감. 이 저품질은 (코드 전용 답변이므로 구문 분석 오류가 발생하기 때문에) 내부에서 익명 함수 만 사용하는 D.Martin의 방법과 중복됩니다 array_filter(). 개인적으로 구현할 때 익명 함수를 사용하고 있지만 SO에 대한 올바른 조치는이 페이지가 부풀어 오르지 않도록 미세 개선을 원한다면 D.Martin의 답변에 대해 의견을 말하거나 편집하는 것입니다. 이 중복 답변을 삭제하십시오.
mickmackusa

4

이렇게 될 것입니다 :

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");

4

이것은 배열에서 여러 값을 삭제할 수있는 간단한 반복입니다.

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }

이것은 PHP 개발자가 이미 만든 것을 대체하는 비효율적이고 홈 롤 대체입니다 array_diff(). 이것은 어떻게 3 개의 공감대를 얻었습니까 이 답변이 도움이되거나 자신의 프로젝트에서 사용해서는 안됩니다. 이 답변을 삭제하는 것이 좋습니다. 이렇게하면 계정의 품질이 낮은 답변을 풀고이 페이지의 답변을 줄이고 징계 배지를받을 수 있습니다. 보상을 연기 할 시간을 갖도록 내 하향 투표를 연기합니다.
mickmackusa

4

그냥 한 줄로 할 수 있습니다. 배열에서 요소를 제거합니다.


$array=array_diff($array,['strawberry']);


3

현재이 기능을 사용하고 있습니다 :

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

제거해야 할 요소가있는 배열 또는 문자열 만 입력 할 수 있습니다. 다음과 같이 작성하십시오.

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

또는

$detils = array_delete('orange', $detils);

또한 색인을 다시 생성합니다.


2
이것은 끔찍하고 복잡합니다. 이것은 어떻게 3 upvotes를 얻었습니까?!?
mickmackusa

2

이 질문에는 몇 가지 답변이 있지만 특정 요소가 제거 될 때 (초기 색인이 저장되기 때문에) 새로운 배열의 색인을 사용하여 재생 unset하거나 array_diff여러 가지 문제가 있었기 때문에 더 많은 것을 추가하고 싶습니다.

나는 예제로 돌아갑니다.

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

또는

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

결과를 인쇄하면 다음을 얻을 수 있습니다.

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

결과 :

> apple
> orange
> blueberry
> kiwi

그러나 색인이 저장되므로 다음과 같은 요소에 액세스 할 수 있습니다.

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

따라서 최종 배열은 다시 색인화되지 않습니다. 그래서 당신은 unsetor array_diff다음 에 추가해야합니다 :

$array_without_strawberries = array_values($array);

그 후 배열은 정상적인 색인을 갖습니다.

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

이 글과 관련하여 : Re-Index Array

여기에 이미지 설명을 입력하십시오

그것이 도움이되기를 바랍니다.


1

더 좋은 방법은 값을 연관 배열의 키로 유지 한 다음 array_keys()실제 배열을 원할 때 호출 하는 것입니다. 그렇게하면 array_search요소를 찾기 위해 사용할 필요가 없습니다 .


1
귀하의 게시물은 답변이 아닌 의견입니다. 질문 자체를 삭제하고 게시하십시오.
mickmackusa

1

에 대한 대답 PHP 배열 (키가 아닌) 값에 의해 삭제 에 의해 주어 https://stackoverflow.com/users/924109/rok-kralj

IMO는 제거하고 돌연변이하지 않으므로 가장 좋은 대답입니다.

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

원하는 경우 동시에 원하는만큼 많은 요소를 제거 할 수 있습니다.

면책 조항 : 내 솔루션은 배열의 새로운 사본을 생성하면서 변경 된 수용 된 대답과 대조적으로 이전 배열을 그대로 유지합니다. 이 때문에 약간 느려질 수 있습니다.


1

나는 같은 질문에 대한 답을 찾고 있었고이 주제를 보았습니다. array_search& 의 조합 unset과의 사용이라는 두 가지 주요 방법 이 있습니다 array_diff. 언뜻보기에는 첫 번째 방법이 더 빠를 것 같습니다. 왜냐하면 추가 배열을 만들 필요가 없기 때문입니다 (을 사용할 때와 같이 array_diff). 그러나 나는 작은 벤치 마크를 작성하고 두 번째 방법이 더 간결하고 빠르지 않은지 확인했습니다! 이것을 공유하게되어 기쁩니다. :)

https://glot.io/snippets/f6ow6biaol


0

array_key_exists 를 사용 하여 배열에서 키를 검색 하는 것을 선호합니다 .

Array([0]=>'A',[1]=>'B',['key'=>'value'])

array_search와 in_array ()는 여기서 작동하지 않기 때문에 지정된 것을 효과적으로 찾으려면. 그리고 unset ()으로 물건을 제거하십시오. .

나는 그것이 누군가를 도울 것이라고 생각합니다.


0

특정 배열 값을 삭제하여 숫자 형 배열 만들기

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

이 링크를 참조 할 수 있습니다.


공감. 질문은 키가 아닌 값을 기준으로 값을 제거하도록 명확하게 요청합니다. 이 답변은 쓸모가 없습니다. 삭제하십시오.
mickmackusa

0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}

이 답변은 필요한 옵션을 제거하지도 않습니다.
Nigel Ren

-1

를 사용 array_seach()하여 다음을 시도하십시오.

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search()찾은 요소의 키를 반환합니다.이 키는를 사용하여 원래 배열에서 해당 요소를 제거하는 데 사용할 수 있습니다 unset(). FALSE실패시 리턴 되지만 성공시 "거짓"값을 리턴 할 수 있습니다 ( 0예 : 키가있을 수 있음 ). 따라서 엄격한 비교 !==연산자가 사용됩니다.

if()문 여부를 확인합니다 array_search()값을 반환하고 한 경우에만 작업을 수행합니다.


3
공감. 이것은 몇 년 전에 게시 된 Gumbo의 방법 (현재 허용되는 솔루션)의 복제본입니다. 중복 답변은 가치가 없으며 불필요한 페이지 부풀림 만 유발합니다. 답을 삭제하십시오. Gumbo의 답변을 설명하려면 자신의 답변을 편집하거나 Gumbo에게 자신의 답변을 확장하도록 요청하십시오 ..
mickmackusa

-1
unset($array[array_search('strawberry', $array)]);

2
공감. array_search()- unset()방법은 이미 당신 전에 존 콘데 년으로 게시했습니다. 중복 답변은 독자에게 가치가 없으며 중복 정보를 스크롤하고 읽는 동안 시간이 낭비되어 실제로 불편합니다. 이 답변을 삭제하십시오.
mickmackusa

-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>

2
a) 코드의 기능 및 b) 다른 모든 답변 중에서 선택 사항이라고 생각하는 이유에 대해 한두 문장을 작성하여이 답변을 개선 할 수 있습니다.
Robin Mackenzie

-1
foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }

4
제공 한 답변 외에도 문제가 해결되는 이유와 방법에 대한 간단한 설명을 제공하십시오.
jtate

-2
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);

2
설명도 추가하십시오. 문제를 해결하는 방법.
Rahil Wazir

귀하의 답변은 배열의 한 요소를 다른 NO로 대체하여 요소를 제거합니다
ahmed hamdy

공감. 이 답변은 예상 출력을 제공하지 않습니다. 이 잘못된 답변을 삭제하십시오.
mickmackusa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.