2

次の 2 つのケースで、print_r を介して異なる出力が得られるのはなぜですか? これはphpのバグですか?php は、関数内で呼び出される複雑な階層関数を実行できませんか?

CASE 1 :
$aa='2,3,4,5,5,5,';
$aa=array_unique(explode(',',$aa));
array_pop($aa);
print_r($aa);

CASE 2 :
$aa='2,3,4,5,5,5,';
array_pop(array_unique(explode(',',$aa)));
print_r($aa)

最初のケースでは、出力は展開された配列です:

Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 ) 

2 番目のケースでは、出力は string です。

2,3,4,5,5,5,
4

2 に答える 2

7

これは、array_popがその入力を変更し、一時変数 (ではない$aa) を渡しているためです。

ドキュメントの署名に注意してください: array_pop ( array &$array )-&これは、参照によってパラメーターを受け取り、その入力変数を変更することを意味します。

他の 2 つの関数と比較してください。

array explode ( string $delimiter , string $string , int $limit )

array array_unique ( array $array , int $sort_flags = SORT_STRING )

$aa最初のケースでは、の出力で更新し、array_unique()それを渡してarray_pop変更します。

2 番目のケースでは、の出力はarray_unique()同じになりますが、この一時的な値は変数に割り当てられていないため、array_pop呼び出された後に忘れられます。

PHP では (たとえば C++ とは異なり)、参照渡しは実際には値渡しよりも遅いため、関数の入力パラメーターを変更するためにのみ使用されることに注意してください。

于 2012-05-27T10:15:28.573 に答える
0

最初のケースでは、2 行目の bs のように変数を変更し、代入演算子 = で新しい値を代入します。

于 2012-05-27T10:19:57.027 に答える