PHP配列の値をクリアする最良の方法


172

配列内のすべての値をクリアするには、どちらが効率的ですか?最初の例では、2番目の例のループで毎回その関数を使用する必要があります。

foreach ($array as $i => $value) {
    unset($array[$i]);
}

またはこれ

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}

5
何が問題になっていunset($array)ますか?
ブレイク

13
変数を削除します。
el_pup_le 2012

2
ええ、でも、そのように設定したnull配列を評価したいのはなぜですか?
ブレイク

3
ソース?メモリ内のどの変数も、varがnullであるよりも小さくなるようには見えません。
ブレイク

回答:


256

ザックが下のコメントで言ったように、あなたは単にそれを使ってそれを再インスタンス化することができます

$foo = array(); // $foo is still here

より強力な何かを使用したい場合は、シンボルテーブルから$ fooもクリアするため、unsetを使用します。後で配列を再度インスタンス化する必要がある場合にのみ使用します。

unset($foo); // $foo is gone
$foo = array(); // $foo is here again

63
なぜそれを再インスタンス化しないの$foo = array();ですか?
ザックザトキンゴールド2013

2
@NishamMahsin使用するglobal $foo; unset($foo);か、unset($GLOBALS['foo']);
Eric Herlitzが

7
@vivoconunxino筆者が「PHP配列の値をクリアする最善の方法」と質問したため、このように記述しました。「新しいインスタンス」ではなく「明確」です。使用unsetすると$fooシンボルテーブルがクリアされます。非常に大きなテーブルについて話しているので$foo = null; unset($foo);、メモリを少しクリアするので、おそらくお勧めします。ただし、その動作(GC)は一定ではなく、PHPのバージョンによって異なる場合があります。
Eric Herlitz 2014年

5
unset()は非常に悪い場合があり、誤って使用すると問題が発生する可能性があります。OPは正しく答えません。彼がこれをベストアンサーとして受け入れた理由がわからない、彼自身の質問に対する彼のコメントは、unsetの問題は変数を削除することであると述べています。このソリューションが引き起こす問題を確認するには、ここで私の答えを見てください
Wolfsblvt

2
すべてをサポートするために$foo = array();:実際にはそこに概念的な問題があるかもしれません:構造を再インスタンス化することはそれを空にすることと同じではありません。メモリを扱うとき、割り当てが遅いのと同じことではないことがわかります。そのため、使いやすさにもかかわらず、特に何度もすばやく実行する必要がある場合は、再インスタンス化がこの質問の答えにならない場合があります。うまくいくかもしれませんが、PHPのメモリ管理であるIMOに大きく依存します。
TechNyquist

82

変数を空の配列にリセットするだけの場合は、単純に再初期化できます。

$foo = array();

これはそれへの参照を維持することに注意してください:

$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!

参照を解除したい場合は、まず設定を解除してください:

$foo = array(1,2,3);
$bar = &$foo;
// ...
unset($foo); // break references
$foo = array(); // re-initialize to empty array
var_dump($bar); // array(3) { 1, 2, 3 } -- $bar is unchanged

3
これが最良の答えだと思います。受け入れられるべきです。最も簡単な方法を示し、unset使用する理由と時期についても説明します。+1

これは私のコードです:justpaste.it/1gt46。変数で複数のIDを宣言するにはどうすればよいですか。単一の値の宣言は次のとおりです:$ productId = 19; $ productId =で複数の値を宣言するにはどうすればよいですか?
Gem

@Rathinam配列をクリアすることとの関係がわかりません。Stackoverflowに新しい質問を投稿し、コードを質問に直接貼り付けてください。
mpen 2018

32

残念ながら、他の質問には答えられず、十分な評判もありませんが、私にとって非常に重要なことを指摘する必要があります。それは他の人々にも役立つと思います。

元の配列の参照が必要ない限り、変数の設定を解除するのは良い方法です!

私が何を意味するのかを明確にするために、配列の参照を使用する関数がある場合、たとえば、次のようなソート関数

function special_sort_my_array(&$array)
{
    $temporary_list = create_assoziative_special_list_out_of_array($array);

    sort_my_list($temporary_list);

    unset($array);
    foreach($temporary_list as $k => $v)
    {
        $array[$k] = $v;
    }
}

動作していません!ここで注意してください。unset参照が削除されるため、変数$arrayが再度作成されて正しく入力されますが、値は関数の外部からアクセスできません。

したがって、参照がある場合$array = array()unset、の代わりに使用する必要があります。


3
これが答えになるはずです-OPは、配列変数全体を逆参照するのではなく、配列の値を明確に示しています。
ロス・

13

配列が連想配列である場合は、最初に考えます。そうでない場合は、forループを使用します。

for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }

可能であれば、

$array = array();

配列を空の配列にリセットすることをお勧めします。





2

unset()を使用して配列をクリアしましたが、unset()が配列をnullにするため、たとえば次のように配列を再宣言する必要があることに気付きました

<?php 
    $arr = array();
    array_push($arr , "foo");
    unset($arr); // this will set the array to null hence you need the line below or redeclaring it.
    $arr  = array();

    // do what ever you want here
?>

1

この質問は実に古いと思いますが、その問題のために、配列内のすべての値を設定解除する再帰関数を作成しました。指定された配列の値も配列である可能性があるため、再帰的です。それで私にとってはうまくいきます:

function empty_array(& $complete_array) {
    foreach($complete_array as $ckey => $cvalue)
    {
        if (!is_array($cvalue)) {
            $complete_array[$ckey] = "";
        } else {
            empty_array( $complete_array[$ckey]);
        }

    }
    return $complete_array;

}

だから、私はすべてのキーとサブ配列を持つ配列を取得しますが、値は空です。


1

多分シンプルで経済的な方法(使用する兆候が少ない)...

$array = [];

私たちはphpマニュアルで読むことができます:

PHP 5.4以降では、array()を[]に置き換える短い配列構文を使用することもできます。


あなたもそれを説明する必要があります。
クルシュレシュK

0

解除ガベージコレクタは、昼休みを持っていないながら、そのラウンドをやっているときに便利です。

ただし、unset関数はデータへの変数参照を破棄するだけで、データは依然としてメモリに存在し、PHPはメモリへのポインタがなくなってもメモリを使用中と見なします。

解決策:null少なくともガベージコレクターがデータを保持するまで、変数に 割り当ててデータをクリアします。

$var = null;

次に、同様の方法で設定を解除します。

unset($var);

4
それは正しく聞こえません。これを設定してnullすぐにガベージコレクションを強制することはないと思います。そのためのリファレンスはありますか?
mpen 2015

@mpen この例でNULLは、$var代入によって変数の場所に格納されている値が置き換えられることに同意しますか?
Anthony Rutledge

1
@AnthonyRutledgeいいえ、私はしません。私が知っている限りでは、PHPは$varいくつかのグローバルNULLオブジェクトをポイントするように更新され、$varガベージコレクションが行われるまでのデータはそのままにしておきます。なぜインタプリタはすぐにそのデータを上書きせざるを得ないのですか?
mpen

@mpenそれは良い質問ですが、その世界では少なくともすべてを収集する準備ができています。
Anthony Rutledge

確かに。ポイントは、私はそれが任意のを助ける設定解除する前にこれをnullに設定疑うということである
MPEN

-1

これは強力でテスト済みですunset($ gradearray); //配列を再設定します


1
質問に答えるには、どちらが最良の方法であり、その理由を説明する必要があります
Fabian Horlacher、2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.