php 实现一个简单的查找数组

mzaanser  于 2023-05-27  发布在  PHP
关注(0)|答案(5)|浏览(100)

我经常发现自己需要一个简单的PHP查找数组/表,而不想使用数据库。
例如,我可能有:
下面示出了可以实现它的两种方式。一个比另一个更有效吗?有没有其他更直观的方法来实现这一点?

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];
gstyhher

gstyhher1#

这是一个问题,你要做什么与您的查找。

  • 如果只是查找键->值对,那么使用数组是一个不错的选择
  • 如果您想根据键执行不同的操作-这实际上是Strategy pattern的一个很好的用例-根本不需要casearray

因此,在大多数情况下,case选项是较差的,因为它的可扩展性较低,并且不能在运行时更改。
要模拟default的情况,请使用类似

$result = in_array($key, $lookup) ? $lookup[$key] : $default;
vuv7lop3

vuv7lop32#

第二个例子。主要原因是它的代码更少,写在新的条目,但它也更灵活的代码,和 * 可能 * 是 * 边际 * 更快。但是要从break语句实现default的情况,'lookup'行/函数应该如下所示:

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

juzqafwq3#

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

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

数组是用第一对[]初始化的,特定的值是用第二对访问的
我不知道,因为哪个版本的php这工程我最近遇到了这个建设上的随机教程,将更新的答案,如果我遇到更多的细节

fwzugrvs

fwzugrvs4#

我建议在开关块上使用查找阵列,只有极少数例外。坦率地说,我对开关块有偏见,因为如果它们是用适当的编码标准编写的,它们会可怕地膨胀脚本。或者,您可以解决所有这些casebreak表达式所产生的膨胀,但这样您就会得到一个非常密集的脚本。
不,我强烈建议使用查找数组。它将数据资产与处理完美地分离开来。这会产生干净、可读、可维护的代码。此外,随着应用程序的发展/成熟,如果需要,您可以轻松地将数据集合移植到数据库表中。
关于效率,使用isset()array_key_exists()(取决于需求)的查找技术非常快,因为php可以引用键。
使用基于键的查找每次都会优于in_array()
这里有一个片段的上下文...
代码:(Demo

$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 coalescing operator
如果您不需要在任何后续进程中利用查找数组,则可以使用match()实现上述代码片段的现代等效物。Demo

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

hgqdbh6s5#

当然是后者,特别是如果你有很多数据...

相关问题