繁体   English   中英

为 PHP 中的 switch-case 参数捕获“变体”或“组合”或“别名”的有效方法

[英]Efficient way to capture “variations” or “combinations” ore “aliases” for switch-case argument(s) in PHP

我很确定这个挑战已经被某人解决了,但即使用不同的词搜索,我也找不到这个问题的解决方案:

我尝试让用户有可能基于类似的参数运行 class 的某些功能

service_class::do_this("selection-argument");

但用户应该能够使用“清晰的词”以及“别名”甚至“众所周知的”缩写或同义词。

我使用开关盒构造来调用“真正的”function。

示例:要获取文件夹的内容,用户可以使用“getdir”、“dir”、“Directory”、“getfolder”、“getcontent”、“content”、“d-cont”和其他一些“匹配单词”以启动底层函数并返回相同的结果。

捕获小写/大写很简单。 我寻找的是一种捕获所有可能“变体”的有效方法——当然,这就是调用不同函数的不同数量的变体。

目前我使用多个“case”:一行接一个,但这使得代码很长,而且我希望用户能够“增强”某个 function 的识别集。

这就是为什么我考虑使用“stripos”来首先确定要使用什么“内部单词”,然后才进入 switch-case 构造。

任何人都有这个问题,可以指导我找到一个“好的和有效的”解决方案吗?

似乎 Stck-exchange 本身也有类似的挑战( https://codereview.stackexchange.com/tags/php/synonyms )......也许我可以简单地重用底层代码?

如果我忽略了已经发布的解决方案,请提前致谢。

您可以使用数据库或数组。 让我们做后者。 因此,要确定用户是否想要获取目录,您将定义一个这样的数组:

$getDirVariants = ['getdir', 
                   'dir', 
                   'directory', 
                   'getfolder', 
                   'getcontent', 
                   'content', 
                   'd-cont'];

添加更多这些 arrays 很容易。 要测试查询词,您将执行以下操作:

$queryWord = strtolower($queryWord);
if (in_array($queryWord, $getDirVariants)) service_class::getDir(<arguments>);
elseif (in_array($queryWord, $deleteVariants)) service_class::delete(<arguments>);

您可以轻松添加到 arrays 或使其成为二维数组以包含更多命令。 该数组也可以放置在数据库中。

尤其是命令多、变种多的时候,数据库会是更好的解决方案,因为一个数据库查询就可以找到查询词。

当有很多命令时,我可以想到一个变体,它也可以简化代码。 您可以使用关联数组来查找命令:

$commandVariants = ['getdir'     => 'getdir', 
                    'dir'        => 'getdir', 
                    'directory'  => 'getdir', 
                    'getfolder'  => 'getdir', 
                    'getcontent' => 'getdir', 
                    'content'    => 'getdir', 
                    'd-cont'     => 'getdir',
                    'delete'     => 'delete',
                    'del'        => 'delete',
                    'remove'     => 'delete',
                    'unlink'     => 'delete'];

$queryWord = strtolower($queryWord);
if (isset($commandVariants[$queryWord])) {
    $command = $commandVariants[$queryWord];
    service_class::$command(<arguments>);
}
else echo "I don't recognize that command.";

这使用变量标识符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM