实现一个简单的查找数组


Implementing a simple lookup array

我经常发现自己需要一个简单的PHP查找数组/表,而我不想使用数据库。

例如,我可能有:

1 stands for "Good"
2 stands for "Bad"
3 stands for "Ugly"

实现它的两种方法如下所示。一个比另一个更有效率吗?有没有其他更直观的方法来实现这个?

switch($code)
{
    case 1:
        $result = "Good";
        break;
    case 2:
        $result = "Bad";
        break;
    case 3:
        $result = "Ugly";
        break;
    default:
        $result = NULL;
}
$array = array(
    1 => "Good",
    2 => "Bad",
    3 => "Ugly"
);
$result = $array[$code];

这是一个你将如何处理你的查找的问题。

  • 如果它只是查找键->值对-数组是一种方式
  • 如果你想根据键执行不同的操作-这实际上是策略模式的一个很好的用例-没有casearray那样。

因此,case选项在大多数情况下是次等的,因为它的可伸缩性较差,并且不能在运行时更改。

要模拟default的情况,使用类似

的内容
$result = in_array($key, $lookup) ? $lookup[$key] : $default;

第二个例子。主要原因是在新条目中编写的代码更少,但它也是更灵活的代码,并且可能比略快。但是要从break语句中实现default情况,'lookup'行/函数应该看起来像:

$result = (isset($array[$code]) ? $array[$code] : NULL;

显然您可以使用更简单的语法:

$result=[1=>"Good",2=>"Bad",3=>"Ugly"][$code];

数组用第一对[]初始化,具体值用第二对

访问。

我不知道这是哪个版本的PHP,我最近在一个随机教程中遇到了这个结构,如果我遇到更多的细节,我会更新答案

我建议在交换块上使用查找数组,很少有例外。坦率地说,我对开关块有偏见,因为如果它们是用适当的编码标准编写的,它们会使脚本非常臃肿。或者,您可以与所有这些casebreak表达式生成的膨胀作斗争,但这样您会得到一个可怕的密集脚本。

不,我强烈建议使用查找数组。它完美地将数据资产与处理分离开来。这将产生干净、可读、可维护的代码。此外,随着应用程序的发展/成熟,如果需要,您可以轻松地将数据集合移植到数据库表中。

关于效率,使用isset()array_key_exists()(取决于需求)的查找技术非常快,因为php可以引用键。

使用基于键的查找每次都将优于in_array()

这是context的一个片段…

代码(演示):

$lookup = [
    null,
    "Good",
    "Bad",
    "Ugly"
];
foreach (range(0, 5) as $test) {
    echo $test , ' : ' , ($lookup[$test] ?? $lookup[0]) , "'n";
}
输出:

0 :         // null
1 : Good
2 : Bad
3 : Ugly
4 :         // null 
5 :         // null 

当然,您可以写出查找数组中的键,以提高人类的可读性。

假设您的php版本允许,为了简洁起见,我建议使用null合并操作符。


如果您不需要为任何后续处理利用查找数组,则可以使用match()实现上述代码片段的现代版本。演示

foreach (range(0, 5) as $test) {
    printf(
        "%s %s'n",
        $test,
        match($test) {
            1 => 'Good',
            2 => 'Bad',
            3 => 'Ugly',
            default => null
        }
    );
}

绝对是后者,特别是如果你有很多数据…

相关文章: