in_array 与 strpos 在 php 中的性能对比

2023-11-25

我通过 Windows 身份验证登录用户,然后将该用户的权限存储在会话变量中。我在数据库中使用分隔权限存储方法,即:

$rights //retrieved from database 
= 'read,edit,delete,admin'

所以我的问题是我应该吗?

//generate variable
$_SESSION['userrights'] = $rights ($rights is retrieved from database)

//use strpos to find if right is allowed
if (strpos($_SESSION['userrights'],"admin") !== false) { // do the function }

OR

//make array of rights
$_SESSION['userrights'] = explode(',',$rights)

//use in_array to find if right is allowed
if (in_array("admin",$_SESSION['userrights'])) { // do the function }

这是一个强迫症问题,因为我认为对于我正在做的事情来说,差异几乎可以忽略不计,但哪种方法会更快(使用更少的资源)?

除了那些侮辱我的权利存储方法的答案之外,任何答案都会受到赞赏!


由于我经常处理大型数据集,所以我会选择isset or !empty在关联数组上并检查键,就像 @Barmar 建议的那样。这是一个快速 1M 基准测试英特尔® 酷睿™ i3-540 (3.06 GHz)

$test = array("read", "edit", "delete", "admin");

echo "<pre>";

// --- strpos($rights,$test[$i%4]) ---

$rights = 'read,edit,delete,admin';
$mctime = microtime(true);
for($i=0; $i<=1000000; $i++) { if (strpos($rights,$test[$i%4]) !== false) { }}
echo '  strpos(... '.round(microtime(true)-$mctime,3)."s\n";

// --- in_array($test[$i%4],$rights) ---

$rights = array("read", "edit", "delete", "admin");
$mctime = microtime(true);
for($i=0; $i<=1000000; $i++) { if (in_array($test[$i%4],$rights)) { }}
echo 'in_array(... '.round(microtime(true)-$mctime,3)."s\n";

// --- !empty($rights[$test[$i%4]]) ---

$rights = array('read' => 1, 'edit' => 1, 'delete' => 1, 'admin' => 1);
$mctime = microtime(true);
for($i=0; $i<=1000000; $i++) { if (!empty($rights[$test[$i%4]])) { }}
echo '  !empty(... '.round(microtime(true)-$mctime,3)."s\n";

// --- isset($rights[$test[$i%4]]) ---

$rights = array('read' => 1, 'edit' => 1, 'delete' => 1, 'admin' => 1);
$mctime = microtime(true);
for($i=0; $i<=1000000; $i++) { if (isset($rights[$test[$i%4]])) { }}
echo '   isset(... '.round(microtime(true)-$mctime,3)."s\n\n";

echo "</pre>";

获胜者是isset:

  strpos(... 0.393s
in_array(... 0.519s
  !empty(... 0.232s
   isset(... 0.209s
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

in_array 与 strpos 在 php 中的性能对比 的相关文章

随机推荐

  • java.awt.Desktop 类

    我正在使用适用于 Android 的 Google API 由于适用于 Android 的 Google API G Suite Quickstart 引用了他们的 java 示例 因此我正在尝试实现此功能 GoogleAuthorizat
  • PHP 增加一半

    我有一个简单的问题 可能很容易回答 我已经搜索过 但不确定我是否搜索正确或什么 不管怎样 使用PHP 我怎样才能将增量减半呢 例如 我知道我可以使用以下循环
  • 选择 2 个带有国旗的国家/地区下拉列表

    有人有一个易于使用的国家 地区下拉列表示例 带有国旗 用于Select2 我即将实施一个基于this建议 但我宁愿避免重新发明轮子 我正在研究类似的问题 这就是我的解决方法 function function var isoCountrie
  • DownloadManager 发送 STATUS_SUCCESSFUL 下载失败

    好的 我正在下载文件 图像 下载完成后 我想发送一条带有图像本地 URI 的消息 但有 20 的时间我会得到这样的信息 6 01 18 46 39 900 INFO DownloadManager 412 Initiating reques
  • 使用 JavaScript 遍历 JSON 对象树的所有节点

    我想遍历 JSON 对象树 但找不到任何库 看起来并不困难 但感觉就像重新发明轮子 在 XML 中 有很多教程展示如何使用 DOM 遍历 XML 树 如果你认为 jQuery 是一种overkill对于这样一个原始的任务 你可以这样做 yo
  • 如何创建一个将数字转换为双射十六进制的函数?

    也许我的数学不够好 但我在将数字转换为纯字母顺序时遇到问题双射十六进制就像 Microsoft Excel OpenOffice Calc 的做法一样 这是我的代码的一个版本 但没有提供我需要的输出 var toHexvg function
  • 如何在 Django 模板中使用 Jquery/Ajax 正确刷新 div

    我尝试过实施该解决方案here 但我似乎无法让它正常工作 我有一个 div 它是使用 Django 模板内的循环填充的 就在其下方 有一个输入框 我可以在其中输入一些文本 然后单击 提交 Submit 操作应该触发一个 Jquery 脚本
  • Spring安全Java配置

    我正在尝试使用 JavaConfig 而不是 Spring Security 的 XML 配置 我想用 PreAuthorization用于声明访问权限 我的 Spring 安全配置如下所示 Configuration EnableWebS
  • 在 Django 管理中编辑组对象时将用户对象分配给组

    在用户对象 编辑用户 的默认 Django 管理视图中 可以编辑用户的组成员身份 如果我也想反过来怎么办 IE 在群组编辑页面中 可以选择属于正在编辑的群组的用户 正如我所看到的 Django 没有从 Group 到 User 对象的 Ma
  • 将外键作为主键可以吗?

    我有两张桌子 用户 用户名 密码 个人资料 个人资料 ID 性别 出生日期 目前我正在使用这种方法 每个配置文件记录都有一个名为 userId 的字段 如下所示外键它链接到用户表 当用户注册时 会自动创建他的个人资料记录 我对我朋友的建议感
  • Symfony2 中的路由:可选参数 en 四个 url 用于一个路由

    在我的 Symfony2 应用程序中 我希望通过一条路由可以实现四个 url 很多其他的东西 报告 20 负数 很多其他的东西 报告 40 正数 很多其他的东西 报告 无号码 很多其他的东西 报告 没有数字 也没有 我的路线目前如下所示 r
  • WPF ListView 始终显示完整项目

    我有一个带有多个 ListView 控件的应用程序 其中要求 ListView 中的项目必须完全可见 列表中永远不应该显示部分 ListViewItem 如果用户在最终显示部分项目的位置释放 ScrollViewer 则列表应 捕捉 并自行
  • 如何使用 Apple SDK 以编程方式检测并连接到 Wifi 网络

    我想知道如何以编程方式检测并连接到 Wifi 网络 就像 Apple Store 中的 WifiFoFum 应用程序一样 该应用程序已获得批准并最近更新 因此必须有合法的方式来执行此操作 如果有人知道任何方法 请发布一个代码片段 即使它是一
  • CustomValidator ServerValidate 方法不触发

    我已经放了一个CustomValidator在我的表格上 我还没有设置它ControlToValidate财产 在其ServerValidate事件我写了以下内容 protected void CustomValidator1 Server
  • 从 ListView 中删除所选项目

    如何从列表视图中删除选定的项目 foreach ListViewItem eachItem in listView1 SelectedItems listView1 Items Remove eachItem 其中 listView1 是列
  • x86 上成功的未对齐访问的实际效果是什么?

    我总是听说未对齐的访问很糟糕 因为它们会导致运行时错误并使程序崩溃或减慢内存访问速度 然而 我找不到任何关于它们会减慢速度的实际数据 假设我在 x86 上并且有一些 但未知 未对齐访问的份额 实际上可能的最严重的减速是什么 在不消除所有未对
  • 为什么 == 在比较使用相同 int 值装箱的两个对象类型变量时不起作用

    在尝试用 C 实现一个简单的单链表时 我注意到 在比较用 int 值装箱的两个对象类型变量时不起作用 但是 Equals works 想检查一下为什么会这样 下面的代码片段是通用对象类型数据属性 public class Node
  • 对 PySpark DataFrame 进行分组后如何应用描述函数?

    我想找到最干净的方法来应用describe函数到分组的 DataFrame 这个问题也可以扩展到将任何 DF 函数应用于分组的 DF 我测试了分组聚合 Pandas UDF 但没有成功 总有一种方法可以通过将每个统计数据传递到agg功能 但
  • 使用 QWebChannel 时未定义的属性和返回类型

    基于QT QWebEnginePage setWebChannel 传输对象 and Qt 无法从 javascript 调用共享对象方法 属性我尝试制作一个小演示来测试功能 请参阅下面的基本测试代码 我的问题是 在新 QWebChanne
  • in_array 与 strpos 在 php 中的性能对比

    我通过 Windows 身份验证登录用户 然后将该用户的权限存储在会话变量中 我在数据库中使用分隔权限存储方法 即 rights retrieved from database read edit delete admin 所以我的问题是我