我经常发现自己需要一个简单的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];
这是一个你将如何处理你的查找的问题。
- 如果它只是查找键->值对-数组是一种方式
- 如果你想根据键执行不同的操作-这实际上是策略模式的一个很好的用例-没有
case
或array
那样。
因此,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,我最近在一个随机教程中遇到了这个结构,如果我遇到更多的细节,我会更新答案
我建议在交换块上使用查找数组,很少有例外。坦率地说,我对开关块有偏见,因为如果它们是用适当的编码标准编写的,它们会使脚本非常臃肿。或者,您可以与所有这些case
和break
表达式生成的膨胀作斗争,但这样您会得到一个可怕的密集脚本。
不,我强烈建议使用查找数组。它完美地将数据资产与处理分离开来。这将产生干净、可读、可维护的代码。此外,随着应用程序的发展/成熟,如果需要,您可以轻松地将数据集合移植到数据库表中。
关于效率,使用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
}
);
}
绝对是后者,特别是如果你有很多数据…