複数の配列要素の設定を解除するためのより良い方法


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

はい、コードは醜いです、bashする必要はありません。どうすればこれをより良く見せることができますか?

回答:


109

array_diff_keyを使用して削除します

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

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

保持するキーの配列を指定する場合は、array_intersect_keyを使用できます。


6
この方法は実際には魅力として機能するので、なぜこの方法が勝者として受け入れられないのか理解できません!!
アレックス

鮮やかさ!良いですね。配列をループして要素を設定解除する代わりに、これが好きです。
lifo 2017

1
スマートソリューション!!
MAZux 2018年

スマートですが、大きな入力配列には時間がかかります。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 2014

1
array_diff_keyは素晴らしいソリューションです-私はbbradleyでよ
マイケル・

たまたま、foreachを設定せずにこのことを行っていました。それから私はもっと良い解決策があるかもしれないと思いました。グーグルは私をここに導きます。だから私はarray_diff_keyを試しましたが、大きな入力配列のforeachよりもはるかに遅いことがわかりました(少なくとも設定解除するキーの数が比較的少ない場合)。
slepic

47

上記の例よりも優れた別の方法があります。ソース:http//php.net/manual/en/function.unset.php

配列全体をループしてすべてのキーの設定を解除する代わりに、次のように一度だけ設定を解除できます。

配列の例:

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

アレイ全体の場合:

unset($array);

一意のキーの場合:

unset($array["key1"]);

1つの配列内の複数のキーの場合:

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年


ああ!いいね!ありがとう!
SrdjanMarjanovic19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.