5

いくつかのキー、値、オブジェクトなどを含む配列があります。その配列を空にする必要がありますが、最も効率的な方法でそれを行いたいです。

私が思いつくことができる最高のものは次のとおりです。

foreach ($array as $key => $val) unset($array[$key]);

しかし、配列をループして空にする必要があるという考えは好きではありません。確かに、新しい配列を作成してメモリを無駄にすることなく、これを行うための巧妙で巧妙な方法がありますか?

注:配列を再び新しいものとして作成するのに余分なメモリがかかるかどうかはわかりません。そうでない場合、 $array = new array(); それを「空にする」良い方法です。

4

6 に答える 6

5

試してみてください:

$array = array();
于 2013-01-18T12:47:40.127 に答える
2

それはあなたが何を意味するかに大きく依存します。

現在の参照を空にするには、いつでも実行できます

$array = array();

現在のインスタンスをスコープから完全に削除するには

unset($array);

残念ながら、どちらの場合も、各要素に関連付けられたメモリが解放されるとは限りません。

PHP は、変数の「参照」と呼ばれるものを使用します。変数は実際には、データの実際のコンテナーではなく、データを指すラベルまたは参照です。PHPガベージ コレクターは、この問題についてより多くの洞察を提供できます。

次に、ドキュメントから取得したこのを見てください。

$a = "new string";
$c = $b = $a;
xdebug_debug_zval( 'a' );# a: (refcount=3, is_ref=0)='new string'
unset( $b, $c );
xdebug_debug_zval( 'a' );# a: (refcount=1, is_ref=0)='new string'

残念ながら、これはすべての変数に当てはまります。配列を含む。配列に関連付けられたメモリをクリーンアップすることは、まったく別の問題です。


個々のキーで unset() を使用することに関するコメントの長い議論に気付きました。

これは非常に悪い習慣のように感じます。次のコードを検討してください。

class A{
    function __construct($name){$this->name=$name;}
    function __destruct(){echo $this->name;}
}

$a=array();
$b=array();
$c=array();
for($i=0;$i<5;$i++) {
    $a[]=new A('a');
    $b[]=new A('b');
    $c[]=new A('c');
}

unset($a);
$b=array();

echo PHP_EOL.'done'.PHP_EOL;

これは出力されます:

aaaaabbbbb
done
ccccc

特定のデータ構造への参照が 0 に達すると、メモリから削除されます。=array()とはどちらもunset同じことを行います。

実際に必要ない場合は、array()次を使用できますnull

$array=null;

これにより、ラベルはメモリに保持されますが、ラベルが保持していた特定のデータへの参照は削除されます。

于 2013-01-18T12:54:58.830 に答える
1

それは簡単です:

$array = array();

$array は存在し、配列のタイプ (ただし空) になり、データは後でメモリからガベージできます。

于 2013-01-18T12:49:04.353 に答える
0

Suresh Kamrushi が指摘したように、array_keys を使用できます。

foreach (array_keys($array) as $key) unset($array[$key]);

これはおそらく今のところ最も良い解決策です..しかし、誰かがすぐにもっと良いものを思いつくと確信しています:)

于 2013-01-18T12:57:59.230 に答える
0

ええと...なぜでしょうか: $array = array();?

于 2013-01-18T12:48:20.980 に答える
0

これを試して:

// $array is your original array

$array = array_combine( array_keys( $array ), array_fill( 0, count($array), 0 ) );

上記は、キーをそのままにして配列を空白にします。

お役に立てれば。

于 2013-01-18T13:07:58.617 に答える