Лучший способ отключить несколько элементов массива

84

Дело в том, что у меня есть массив из 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']);

Да, код уродливый, не надо бить. Как мне сделать это лучше?

Turtel
источник

Ответы:

109

Используйте array_diff_key для удаления

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

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

Вы можете использовать array_intersect_key, если хотите предоставить массив ключей для хранения.

Тим
источник
6
Не понимаю, почему этот метод не принимается как победный ответ, ведь он действительно работает как шарм !!
Alex
Гениально! Хороший. Мне нравится это вместо того, чтобы перебирать массив и отключать элементы.
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 (), чтобы сделать обратное,
оставив
1
Я с bbradley - array_diff_key - отличное решение
Майкл
Случайно я просто делал это с отключенным foreach. Тогда я подумал, что может быть лучшее решение. Google привел меня сюда. Итак, я попробовал array_diff_key, и оказалось, что он намного медленнее, чем foreach для больших входных массивов (по крайней мере, когда количество ключей, которые нужно отключить, относительно мало).
Slepic
47

Есть другой способ, который лучше приведенных выше примеров. Источник: 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.

Надеюсь, это поможет вам в вашем развитии.

CodingDaily
источник
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, ... откуда угодно;)

NB: extract () небезопасен, поэтому о нем не может быть и речи!

Феликс Имафидон
источник
Из любопытства - почему extract () небезопасен?
Срджан Марьянович
@SrdjanMarjanovic stackoverflow.com/questions/829407/…
Эндрю,
Ой! Хороший! Благодаря!
Срджан Марьянович