[PHP-users 15449]Re: $HTTP_POST_VARSなどをarray_map()で処理する場合の問題について

Seiji Masugata s.masugata @ digicom.dnp.co.jp
2003年 5月 22日 (木) 19:42:29 JST


こんばんわ、桝形です。

> 以上の私の環境に基づく事実、
> 
> 	(1) $HTTP_XXX_VARS は常に配列
> 	(2) array_map() は高速で、入れ子の問題も解決
> 
> から、array_map() を使いたいと思ったのですが、
> [PHP-users 13915] からの一連のスレッドを見ると、array_map() は
> 参照渡し仕様上できない、ということのようです。
> 
> 振りが大変長くなりましたが、
> 
> (1), (2) は、そうであると期待して差し障りはありませんか?

自分もそうだと思っていたのですが。。。下に続きます。

> $HTTP_GET_VARS あたりは、値渡しで、上書きは可能でしょうか?
> それとも、一旦コピーをとる必要があるのでしょうか?
> 
> 実際には以下のコードで処理したいと考えています。
> アドバイスよろしくお願いいたします。
> 
> function remove_null($str) {
> 	return str_replace("\0", ``, $str);
> }
> 
> function sanitize($ary) {
> 	if (get_magic_quotes_gpc()) {
> 		$ary = array_map('stripslashes', $ary);
> 	}
> 	return array_map('remove_null', $ary);
> }
> 
> $get = sanitize($HTTP_GET_VARS); // 値渡しになる?

【環境】

OS     : RedHat Linux6.2J
Apache : 1.3.27
PHP    : 4.3.2RC3( DSO )

上記のサンプルを少し加工し、

<?
function remove_null($str) {
	return str_replace( "\0", ``, $str);
}

function sanitize($ary) {

	if (get_magic_quotes_gpc()) {
		$ary = array_map('stripslashes', $ary);
	}

	return array_map('remove_null', $ary);
}


function hoge($get) {

	global $HTTP_GET_VARS;

	print_r($HTTP_GET_VARS);
	$HTTP_GET_VARS = $get;
}

print_r($HTTP_GET_VARS);

$get = sanitize($HTTP_GET_VARS);

print_r($get);

hoge($get);

print_r($HTTP_GET_VARS);
?>


http://www.example.com/test.php?W[][][]=1&X[][]=1&Y[]=1&Z=1

とすると、結果が、
---------------------------------------------------------------------
Array
(
    [W] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => 1
                        )

                )

        )

    [X] => Array
        (
            [0] => Array
                (
                    [0] => 1
                )

        )

    [Y] => Array
        (
            [0] => 1
        )

    [Z] => 1
)
---------------------------------------------------------------------
Array
(
    [W] => Array
        (
            [0] => Array
        )

    [X] => Array
        (
            [0] => Array
        )

    [Y] => Array
        (
            [0] => 1
        )

    [Z] => 1
)
---------------------------------------------------------------------
Array
(
    [W] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => 1
                        )

                )

        )

    [X] => Array
        (
            [0] => Array
                (
                    [0] => 1
                )

        )

    [Y] => Array
        (
            [0] => 1
        )

    [Z] => 1
)
---------------------------------------------------------------------
Array
(
    [W] => Array
        (
            [0] => Array
        )

    [X] => Array
        (
            [0] => Array
        )

    [Y] => Array
        (
            [0] => 1
        )

    [Z] => 1
)
---------------------------------------------------------------------

と、なりました( 分かりにくくてすみません )。

この動作からすると、array_mapは配列が深すぎると駄目な
動作をしてるようですねぇ。。。使い方間違ってます?

動作的に

> $HTTP_GET_VARS あたりは、値渡しで、上書きは可能でしょうか?

は、満たせていそうです。

毎度の事ですが、あまり参考にならなくてすみません。

--
Seiji Masugata <s.masugata @ digicom.dnp.co.jp>




PHP-users メーリングリストの案内