2017-03-29 6 views
0

私は(デバッグ目的のために)、配列内の参照を検出するための簡単な方法を持っている

まず私はarray_valuesで、配列のクローンを作成し、その後、私はクローンを変更し、元の変化を見て。それが変更された場合、その要素は参照です。

ショート例:

<?php 

$a = [ 
    'a' => 'b', 
    2 => 3, 
]; 

$b = ['wow']; 

$a['ref'] = &$b; 

function getrefs($array) { 
    $marker = uniqid(); 
    $copy = array_values($array); 
    $i = 0; 
    $return = []; 
    foreach ($array as $key => &$val) { 
     $stash = $val; 
     $copy[$i] = $marker; 
     if ($val === $marker) { 
      $val = $stash; 
      $return[] = $key; 
     } 
     $i++; 
    } 
    return $return; 
} 

var_dump($a); 
var_dump(getrefs($a)); 

問題は、私は$GLOBALSでこれを使用しようとすると、それは働いていない、と私はその理由を把握することはできませんということです。 $GLOBALSのすべては、すべての権利によって参照する必要があります。

$GLOBALSarray_valuesが参照を正しくコピーしない唯一の配列だと奇妙なのですか?

+0

を持つことになります。 '$ GLOBALS ['GLOBALS']'を試しましたか? – AbraCadaver

+0

いいえ、私はちょうどやったと同じ結果を持っています –

答えて

1

再帰を考慮していない可能性があります。組み込みのPHP関数:

var_dump($GLOBALS); 

あなたは `$ GLOBALS`であなたの試みを示さなかった次の出力

array(7) { 
    ["_GET"]=> 
     array(0) { 
    } 
    ["_POST"]=> 
     array(0) { 
    } 
    ["_COOKIE"]=> 
     array(1) { 
     ["PHPSESSID"]=> 
     string(26) "od602et6qcfj6pa3pkjtl8go57" 
    } 
    ["_FILES"]=> 
     array(0) { 
    } 
    ["GLOBALS"]=> 
     *RECURSION* 
    ["_SESSION"]=> 
     &array(0) { 
    } 
} 
+0

それはそれではないです。何らかの理由で '$ GLOBALS'が' array_values'を通るときを除いてそれが割り当てられるたびに参照されます(IE: '$ a = $ GLOBALS; $ a ['test'] = 1234;' $ GLOBALS ['テスト'] === 1234'だが、array_valuesを使うと、最後の参照が何らかの形で壊れているように見える) –

関連する問題