여러 배열 요소를 설정 해제하는 더 나은 방법


82

여기서 거래는 17 개의 요소가있는 배열이 있다는 것입니다. 특정 시간 동안 필요한 요소를 가져 와서 배열에서 영구적으로 제거하고 싶습니다.

코드는 다음과 같습니다.

$name = $post['name'];
$email = $post['email'];
$address = $post['address'];
$telephone = $post['telephone'];
$country = $post['country'];

unset($post['name']);
unset($post['email']);
unset($post['address']);
unset($post['telephone']);
unset($post['country']);

예, 코드는 추악하며 bash 필요가 없습니다. 어떻게하면 더 좋게 만들 수 있습니까?

답변:


105

array_diff_key를 사용하여 제거

$remove = ['telephone', 'country'];

array_diff_key($post, array_flip($remove));

유지할 키 배열을 제공하려면 array_intersect_key를 사용할 수 있습니다.


6
이 방법이 실제로 매력으로 작용하기 때문에이 방법이 당첨 된 답변으로 받아 들여지지 않는 이유를 이해하지 마십시오 !!
알렉스

훌륭한! 멋지네요. 나는 배열을 반복하고 요소를 설정 해제하는 대신 이것을 좋아합니다.
lifo

1
스마트 솔루션 !!
MAZux

스마트하지만 큰 입력 배열의 경우 느립니다. foreach unset은 큰 입력 배열과 (적어도) 설정 해제 할 키 수가 상대적으로 적 으면 훨씬 더 빠릅니다.
slepic

101

함수 extract()가 수행하려는 작업에 대해 더 나은 도구 인 것처럼 보입니다 (배열에서 모든 키 / 값을 추출하고 로컬 범위의 키와 동일한 이름을 가진 변수에 할당한다고 가정). 콘텐츠를 추출한 후 $post원하는 다른 항목이 포함되어 있지 않다고 가정 하고 전체를 설정 해제 할 수 있습니다.

그러나 실제로 질문에 답하기 위해 제거하고 반복하려는 키 배열을 만들고 명시 적으로 설정을 해제 할 수 있습니다.

$removeKeys = array('name', 'email');

foreach($removeKeys as $key) {
   unset($arr[$key]);
}

... 또는 키가 제거 된 새 배열을 변수로 가리킬 수 있습니다.

$arr = array_diff_key($arr, array_flip($removeKeys));

... 또는 모든 배열 구성원을 unset()...

unset($arr['name'],  $arr['email']);

8
array_diff_key () 는 좋은 해결책입니다. 난 당신이 사용할 수있는 추가 할 것이라고 생각 ) (array_intersect_key 역을 수행하는, 특정 요소를 유지
batfastad

1
나는 bbradley와 함께 해요 - array_diff_key가 훌륭한 솔루션입니다
마이클

우연히 나는 foreach가 설정되지 않은 상태 에서이 일을하고있었습니다. 그런 다음 더 나은 해결책이있을 수 있다고 생각했습니다. Google이 나를 여기로 인도합니다. 그래서 array_diff_key를 시도했는데 큰 입력 배열의 경우 foreach보다 훨씬 느립니다 (적어도 설정 해제 할 키 수가 상대적으로 적을 때).
slepic

46

위의 예보다 더 나은 또 다른 방법이 있습니다. 출처 : http://php.net/manual/en/function.unset.php

전체 배열을 반복하고 모든 키를 설정 해제하는 대신 다음과 같이 한 번만 설정 해제 할 수 있습니다.

예제 어레이 :

$array = array("key1", "key2", "key3");

전체 어레이의 경우 :

unset($array);

고유 키의 경우 :

unset($array["key1"]);

하나의 배열에있는 여러 키의 경우 :

unset($array["key1"], $array["key2"], $array["key3"] ....) and so on.

이것이 당신의 발전에 도움이되기를 바랍니다.


2

나는이 질문이 오래되었다는 것을 이해하지만 최선의 방법은 이것을하는 것입니다.

$vars = array('name', 'email', 'address', 'phone'); /* needed variables */
foreach ($vars as $var) {
    ${$var} = $_POST[$var]; /* create variable on-the-fly */
    unset($_POST[$var]); /* unset variable after use */
}

이제 어디서나 $ name, $ email, ...을 사용할 수 있습니다.)

주의 : extract ()는 안전하지 않으므로 완전히 의문의 여지가 없습니다!


호기심에서-extract ()가 안전하지 않은 이유는 무엇입니까?
Srdjan Marjanovic 2018


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