4

以下のコードをご覧ください

function GetAreaName($AreaCode)
{
  switch ($AreaCode) 
  {
    case 201: return 'New Jersey';
    case 202: return 'Washington';
    // this goes on till
    case 999: return '';
  }
}

たとえば、AreaCode が 998 の場合、非常に多くのケースを通過する必要があります。この関数を最適化するにはどうすればよいでしょうか? (データベースは使用しません。)

配列を構築し、それに対してバイナリ検索を行うことを考えていますか? しかし、これは、関数が呼び出されるたびに配列が再構築されることを意味しますか? 配列を一度構築してキャッシュし、この関数が呼び出されるたびに再利用するにはどうすればよいでしょうか?

4

4 に答える 4

7

ハッシュテーブルを使用しないのはなぜですか?

class Area {

private $areaCodes = array(
            201 => 'New Jersey',
            202 => 'Washington',
            // this goes on till
            999 => '';
        );

    function getStateByAreaCode ($areaCode) {

        if (array_key_exists($areaCode, $this->areaCodes)) {
           return $this->areaCodes[$areaCode];
        } else {
           return false;
        }

    }
}

次のように呼び出します。

$area = new Area();
$city = $area->getStateByAreaCode(303);

クラスをファイルに保存し、必要なときに含めるだけです。

リクエストごとに配列が作成されないようにする方法を尋ねました: これをクラスに入れることで、少なくともきれいに保ちます。技術的にはリクエストごとに作成されますが、配列が巨大でない限り (米国の市外局番よりもはるかに大きい)、パフォーマンスの問題は発生しません。リクエストがあるたびに配列を作成することに不安がある場合は、APC や Zend Optimizer などのコード オプティマイザーを検討してください。これは基本的に、PHP が実行時に生成するバイト コードを受け取り、それをキャッシュします。

于 2012-11-19T05:24:37.770 に答える
2

データベースに保存するだけでよいようです。

しかし、それができない場合は、何らかの構成ファイルに抽象化して永続化されたオブジェクトに保存するか、静的変数を使用してください。

function foo($key) {
    static $cache = array(1 => 'abc', 2 => 'def', 3 => 'ghi');
    if (array_key_exists($key, $cache)) {
        return $cache[$key];
    } else {
        //Somehow signal an error (throw an exception, return boolean false, or something)
    }
}

上記で$cacheは、一度しか存在しません。(値が にならないことがわかっている場合は、 の代わりにnull使用できます。)issetarray_key_exists

ただし、データを変更するにはコードを編集する必要があるため、これはあまり柔軟ではありません。通常、データとコードを分離する必要があります。

これは、何らかのファイル (json、xml、php など) に保存し、一度だけ作成する何らかの構造にロードすることを意味します。次に、そのオブジェクトまたは配列を必要な場所に渡します。(または、ハックしたい場合は、静的クラスを使用できます。ただし、これには反対することをお勧めします。)

于 2012-11-19T05:19:47.657 に答える
2

スイッチ条件は 1 回だけ評価されます。

switch ステートメントでは、条件が 1 回だけ評価され、結果が各 case ステートメントと比較されます。elseif ステートメントでは、条件が再度評価されます。条件が単純な比較よりも複雑である場合、および/またはタイトなループにある場合は、切り替えが高速になる可能性があります。➫➫➫</a>

最適化は必要ありません。ただし、以下をお読みください:
PHP では、どちらが高速か、大きな Switch ステートメント、または配列キー ルックアップ

構成ファイルを作成する場合は、次のようなものを検討できます。

$areas = array
(
  1 => 'abc',
  2 => 'def',
  ..
);

次に、単純に比較します。

if (!isset($areas[$some_code]))
{
  // do something
}
else
{
  // ok
}
于 2012-11-19T05:23:33.297 に答える
0

以下の疑似コードを試してください

$areas = array('201' => 'New Jersey',
                    '202' => 'Washington',
                    ......
                    ........
                    '999' => '');
function GetAreaName($AreaCode)
{


    if(isset($areas[$AreaCode])) {
        return $areas[$AreaCode];
    } else {
        // do something
    }

}
于 2012-11-19T05:27:58.513 に答える