配列内のすべての値をクリアするには、どちらが効率的ですか?最初の例では、2番目の例のループで毎回その関数を使用する必要があります。
foreach ($array as $i => $value) {
unset($array[$i]);
}
またはこれ
foreach($blah_blah as $blah) {
$foo = array();
//do something
$foo = null;
}
配列内のすべての値をクリアするには、どちらが効率的ですか?最初の例では、2番目の例のループで毎回その関数を使用する必要があります。
foreach ($array as $i => $value) {
unset($array[$i]);
}
またはこれ
foreach($blah_blah as $blah) {
$foo = array();
//do something
$foo = null;
}
回答:
ザックが下のコメントで言ったように、あなたは単にそれを使ってそれを再インスタンス化することができます
$foo = array(); // $foo is still here
より強力な何かを使用したい場合は、シンボルテーブルから$ fooもクリアするため、unsetを使用します。後で配列を再度インスタンス化する必要がある場合にのみ使用します。
unset($foo); // $foo is gone
$foo = array(); // $foo is here again
$foo = array();
ですか?
global $foo; unset($foo);
か、unset($GLOBALS['foo']);
unset
すると$foo
シンボルテーブルがクリアされます。非常に大きなテーブルについて話しているので$foo = null; unset($foo);
、メモリを少しクリアするので、おそらくお勧めします。ただし、その動作(GC)は一定ではなく、PHPのバージョンによって異なる場合があります。
$foo = array();
:実際にはそこに概念的な問題があるかもしれません:構造を再インスタンス化することはそれを空にすることと同じではありません。メモリを扱うとき、割り当てが遅いのと同じことではないことがわかります。そのため、使いやすさにもかかわらず、特に何度もすばやく実行する必要がある場合は、再インスタンス化がこの質問の答えにならない場合があります。うまくいくかもしれませんが、PHPのメモリ管理であるIMOに大きく依存します。
変数を空の配列にリセットするだけの場合は、単純に再初期化できます。
$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
残念ながら、他の質問には答えられず、十分な評判もありませんが、私にとって非常に重要なことを指摘する必要があります。それは他の人々にも役立つと思います。
元の配列の参照が必要でない限り、変数の設定を解除するのは良い方法です!
私が何を意味するのかを明確にするために、配列の参照を使用する関数がある場合、たとえば、次のようなソート関数
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
、の代わりに使用する必要があります。
array_splice
配列を空にし、参照を保持するために使用します。
array_splice($myArray, 0);
この質問は実に古いと思いますが、その問題のために、配列内のすべての値を設定解除する再帰関数を作成しました。指定された配列の値も配列である可能性があるため、再帰的です。それで私にとってはうまくいきます:
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;
}
だから、私はすべてのキーとサブ配列を持つ配列を取得しますが、値は空です。
解除ガベージコレクタは、昼休みを持っていないながら、そのラウンドをやっているときに便利です。
ただし、unset関数はデータへの変数参照を破棄するだけで、データは依然としてメモリに存在し、PHPはメモリへのポインタがなくなってもメモリを使用中と見なします。
解決策:null
少なくともガベージコレクターがデータを保持するまで、変数に
割り当ててデータをクリアします。
$var = null;
次に、同様の方法で設定を解除します。
unset($var);
null
すぐにガベージコレクションを強制することはないと思います。そのためのリファレンスはありますか?
NULL
は、$var
代入によって変数の場所に格納されている値が置き換えられることに同意しますか?
$var
いくつかのグローバルNULL
オブジェクトをポイントするように更新され、$var
ガベージコレクションが行われるまでのデータはそのままにしておきます。なぜインタプリタはすぐにそのデータを上書きせざるを得ないのですか?
これは強力でテスト済みですunset($ gradearray); //配列を再設定します
unset($array)
ますか?