0

: 何が起こっているかについて私が間違っていたようで、 を使用しても問題はありません$a = array();。これは、配列へのすべての割り当てがコピーによるものであるためです。(問題を引き起こしている参照によるアクセスがいくつかあると思っていましたが、それは単なるタイプミスでした。以下の回答に詳細を追加しました。

次のようなPHPがあります。

$myArray = array();

function useArray() {
  global $myArray;
  // ... do something with myArray ...
}

function clearArray() {
  global $myArray;
  // ... Somehow clear the global array ...
}

設計の観点からこれが悪いことはわかっていますが、変更できないサードパーティのコードを回避する必要があります...

私の質問は、clearArray機能させるために関数に何を入れることができますか? グローバルバージョンではなくローカルバージョンのみを変更するため、orを使用するという通常のアドバイスは機能しません。$myArray=array();unset($myArray);配列内のキーをループして、それぞれを順番に設定解除できると思います-次のように:

function clearArray() {
  global $myArray;
  foreach($key in array_keys($myArray) ) {
     unset( $myArray[$key] );
  }
}

しかし、それはハッキーで不明確なようです。より良い解決策はありますか?

4

5 に答える 5

0

PHP の配列の割り当てはコピーによるものです (オブジェクトの割り当ては参照によるものです)。これは、存在すると思われる穴の多くが存在しないことを意味します。

簡単な例を次に示します。

$a = array("A");
$b = &$a;
$c = $a;


function clear1() {
  global $a;
  $a = array();
}

clear1();
print(json_encode(array($a,$b,$c))."\n"); 

これは を出力します[[],[],["A"]]。投稿のクリアを使用しても同じ結果が得られます。

function clear2(){
  global $a;
  foreach(array_keys($a) as $key) {
    unset( $a[$key] );
  }
}

whileが$cクリアされない理由は、これは(配列代入のデフォルト)のディープ コピーであり、一方は への参照です。重要なのは、配列は参照ではなく値であるということです。$b$c$a$c$a

globalしたがって、エラーは、配列/オブジェクトの割り当てがどのように機能するかについての欠落または誤解のいずれかである可能性があります。(そして実際には両方でした。)

于 2013-08-14T01:40:18.410 に答える
0

参照によって渡すことができます:

$a = array ('one', 'two', 'three');

print_r ($a);
fone ($a);
print_r ($a);
ftwo ($a);
print_r ($a);

function fone ($a) 
{
   $a = array ();
}

function ftwo (&$a)
{
   $a = array ();
}

結果:

Array
(
    [0] => one
    [1] => two
    [2] => three
)
Array
(
    [0] => one
    [1] => two
    [2] => three
)
Array
(
)
于 2013-08-13T09:12:41.643 に答える