Кращий спосіб зняти кілька елементів масиву


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']);

Так, код негарний, не потрібно битися. Як зробити так, щоб це виглядало краще?

Відповіді:


109

Для видалення використовуйте array_diff_key

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

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

Ви можете використовувати array_intersect_key, якщо хочете надати масив ключів для збереження.


6
Не розумію, чому цей метод не приймається як виграшна відповідь, оскільки він насправді працює як принада !!
Олексій

Блискуче! Хороший. Мені це подобається, замість того, щоб перебирати масив і не встановлювати елементи.
lifo

1
Розумне рішення !!
MAZux

розумний, але повільний для великих вхідних масивів. foreach unset здається набагато швидшим з великими вхідними масивами та (принаймні) відносно невеликою кількістю ключів для 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 - чудове рішення
Майкл

Випадково я просто робив цю справу з невдалим настроєм. Тоді я подумав, що може бути краще рішення. 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.

Сподіваюся, це допоможе вам у вашому розвитку.


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 () не є безпечним, тому це абсолютно неможливо!


З цікавості - чому екстракт () не безпечний?
Srdjan Marjanovic


О! Хороший! Дякую!
Srdjan Marjanovic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.