0

最後に見つかった項目を記憶する「スマートな」配列検索関数を作成しようとしています。

function &GetShop(&$shops, $id) {
    static $lastShop = null;
    if ($lastShop == null) {
        echo "lastShop is null <br/>";
    } else {
        echo "lastShop: [" . print_r($lastShop, true) . "]<br/>";
    }
    if ($lastShop != null && $lastShop['id'] == $id) {
        return $lastShop;
    }
    for ($i = 0; $i < count($shops); $i++) {
        if ($shops[$i]['id'] == $id) {
            $lastShop = &$shops[$i];
            return $shops[$i];
        }
    }
}

$shops = array(
    array("id"=>"1", "name"=>"bakery"),
    array("id"=>"2", "name"=>"flowers")
);

GetShop($shops, 1);
GetShop($shops, 1);
GetShop($shops, 2);
GetShop($shops, 2);

ただし、次の行の発行者がいるようです。

$lastShop = &$shops[$i];

この関数をそのまま実行すると、次の出力が得られます。

lastShop is null 
lastShop is null 
lastShop is null 
lastShop is null 

代わりに「&」を削除して値を渡すと、正常に機能します。

lastShop is null 
lastShop: [Array ( [id] => 1 [name] => bakery ) ]
lastShop: [Array ( [id] => 1 [name] => bakery ) ]
lastShop: [Array ( [id] => 2 [name] => flowers ) ]

ただし、見つかった配列は後で変更する必要があるため、参照渡ししたいと思います。誰かが以前にこの問題に遭遇したことがあり、どのように解決したかアドバイスできますか?

4

1 に答える 1

1

各呼び出しで関数ブロックの先頭に割り当てNULLています。$lastShopしたがって、常に にリセットされNULLます。

ドキュメントで見つけました:

参照は静的に保存されません: […]

&get_instance_ref()この例は、静的変数への参照を割り当てる場合、関数を 2 回目に呼び出したときにそれが記憶されていないことを示しています。

http://php.net/manual/en/language.variables.scope.php#language.variables.scope.references

于 2012-10-20T17:40:01.713 に答える