2016-04-16 9 views
0

PHPで参照渡しに関する質問があります。私はオンラインで検索しましたが、この問題に固有のものは何も表示されませんでした。以下の関数は、配列からキーを除去し、それが配列の更新値だ返し:PHPの参照呼び出しによるパスの埋め込み

function array_fetch($k, array &$a){ 
    if(isset($a[$k]) || array_key_exists($k, $a)){ 
     $v = $a[$k]; 
     unset($a[$k]); 
     return $v; 
    } 

    return null; 
} 

以下のようにIコードを使用している:

function foo(){ 
    return ['a', 'b', 'c']; 
} 

$a = foo(); 
echo array_fetch(1, $a); 
print_r($a); 

B
アレイ([0] => a [2] => c)

これは魅力的な働きをしているので、少し短くしたいと思います:

echo array_fetch(1, $a = foo()); 
print_r($a); 

注意:唯一の変数はで...
参照によって渡されるべき B
アレイ([0] => [1] => B [2] => C)

私は変数として参照を与えると仮定するのは間違っていますか?どうやら配列も変わっていないが、私は理解していない。なぜこれが起こるか。式を()で囲んでも、それは役に立ちません。

更新:

実行可能な回避策はそうのようなラッパー関数を使用することである。

function &ref($var){ 
    return $var; 
} 

echo array_fetch(1, $a = &ref(['a', 'b', 'c'])); 
print_r($a); 

B
アレイ([0] => [2] = > c)

+0

この問題の回避策は、最初の割り当てを行い、その後、関数呼び出しで変数を使用することです。'$ a = foo(); echo array_fetch(1、$ a); ' –

答えて

10

array_fetch(1, $a = foo());ではなく

$aを割り当て、$aを機能させる。

それは

$aを割り当て、機能への割り当ての結果を渡すことです。

結果はassignの演算が割り当てられる値です。

したがって、array_fetch(1, $a = foo());array_fetch(1, ['a', 'b', 'c'])と等価です.2番目の引数は変数ではありません。

だから、唯一の解決策はまだです:

$a = foo(); 
echo array_fetch(1, $a); 
+1

希望のダウンボッターは、自分の答えを書くでしょう。 –

+1

* "希望者は自分の答えを書いてくれるだろう" * - どのように真実と私は完全に良い/有効な答え/解決策のためにdownvotedされていると、彼らは完全な間違いを投稿したか、まったく投稿しなかった。彼らは彼らの口がどこにあるかお金を置くべきである;-) *乾杯* –

関連する問題