4

我经常发现自己需要一个简单的 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];
4

5 回答 5

6

这取决于您将如何处理您的查找。

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

因此,case在大多数情况下,选项较差,因为它的可扩展性较差并且无法在运行时更改。

要模拟这种default情况,请使用类似

$result = in_array($key, $lookup) ? $lookup[$key] : $default;
于 2013-04-18T15:57:13.993 回答
3

第二个例子。主要原因是在新条目中编写的代码更少,但它的代码也更灵活,并且可能稍微快一些。但是要从 break 语句中实现这种default情况,“查找”行/函数应该如下所示:

$result = (isset($array[$code]) ? $array[$code] : NULL;
于 2013-04-18T16:01:49.157 回答
2

显然你可以用更简单的语法来做到这一点:

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

使用第一对 [] 初始化数组,使用第二对访问特定值

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

于 2020-10-19T17:38:08.947 回答
0

绝对是后者,特别是如果您有大量数据...

于 2013-04-18T15:58:28.983 回答
0

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

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

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

in_array()每次使用基于键的查找都会表现出色。

这是上下文的片段...

代码:(演示

$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 版本允许,为了简洁起见,我建议使用空合并运算符

于 2019-07-23T12:25:13.960 回答