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,则可以使用isset而不是array_key_exists。)

这不是很灵活,因为更改数据需要您编辑代码。您通常希望将数据和代码解耦。

这可能意味着将其存储在某种文件(json、xml、php 等)中,然后将其加载到某种结构中,您只创建一次。然后,您可以将该对象或数组传递到需要它的任何地方。(或者,如果你想变得 hacky,你可以使用静态类。不过我建议不要这样做。)

于 2012-11-19T05:19:47.657 回答
2

开关条件只评估一次:

在 switch 语句中,只对条件进行一次评估,并将结果与​​每个 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 回答