Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是做我想做的事情的好方法吗(在PHP中)?_Php_Arrays - Fatal编程技术网

这是做我想做的事情的好方法吗(在PHP中)?

这是做我想做的事情的好方法吗(在PHP中)?,php,arrays,Php,Arrays,我一直在为我的网站开发一个简单的论坛。我正在添加一个功能,将标记自上次访问以来未读的帖子+论坛 我基本上是用每个用户帐户存储最后一次访问论坛的日期。当用户返回站点时,将运行一个查询以获取所有post_id和post_parent_论坛值,然后将其添加到一个数组中,该数组存储在会话变量中,其中键为post_id(唯一),值为论坛id(不会唯一,因为帖子将出现在少数论坛中) 在论坛索引中,我为每个论坛使用In_array(),查看论坛id是否在数组中,如果在数组中,它将被标记为“未读” 在线程列表中

我一直在为我的网站开发一个简单的论坛。我正在添加一个功能,将标记自上次访问以来未读的帖子+论坛

我基本上是用每个用户帐户存储最后一次访问论坛的日期。当用户返回站点时,将运行一个查询以获取所有post_id和post_parent_论坛值,然后将其添加到一个数组中,该数组存储在会话变量中,其中键为post_id(唯一),值为论坛id(不会唯一,因为帖子将出现在少数论坛中)

在论坛索引中,我为每个论坛使用In_array(),查看论坛id是否在数组中,如果在数组中,它将被标记为“未读”

在线程列表中,我使用array_key_exists()查看每个线程ID的键是否在数组中,如果在数组中,则将其标记为“未读”

查看帖子时,该项将从数组中移除,其键等于线程的ID

这种方法合理吗?如果论坛变得更受欢迎,我会遇到问题吗?我担心在每个论坛列表上运行20个array\u key\u exists()检查。它相当快吗


顺便说一句。。。。我可以直接使用会话存储数组吗?或者我必须将其值赋给一个正则变量,删除一个键,取消设置旧的会话变量,然后用更新的数组重新设置它吗?

php数组是哈希表!哈希键查找不是很昂贵,所以不,我认为您不会因此而遇到性能问题

in_数组是另一回事(搜索整个数组),但实际上-它仍然不应该是一个问题。小心过早的优化

我可以直接使用会话存储阵列吗

$\u SESSION
通常只是一个数组,在调用
SESSION\u start()
时通过取消序列化会话文件内容填充该数组。当脚本结束或调用
session\u write\u close()
时,$\u会话数组将
serialize()
返回到文件。没有魔法,真的


如果你应该这样做,那是另一个问题,毕竟会话是一个全局变量(EWWW)。

只是你可以走的另一条路线

在用户表中有一个last_activity timestamp字段,并在用户每次加载新页面时更新它

为每个帖子/论坛设置最近更新的时间戳字段


要查看论坛/帖子是否“未读”,只需比较时间戳即可。

我的做法是:不要担心哈希表的性能,但要考虑与数据库相关的问题,因为它们是最昂贵的资源(尤其是在充满文本的类似论坛的项目中)。我从未遇到过与PHP性能相关的问题。MySQL的问题总是来得更快。

如果用户登录、注销,然后再重新登录,这会起作用吗?难道不是所有的帖子都会被标记为“已读”吗?不会,因为他们最后一次访问的时间戳仍然会保存在他们的帐户中。因此,仅限自上次访问(本例中为1分钟或更短时间前)以来添加的项目。我假设,“自上次访问”是指自上次成功登录(当前登录之前的登录)以来,而不是上次页面刷新。上次oage刷新,因为我想在访问期间为正在制作的阵列添加新线程。我认为这样做更快(更慢)。。。。如果事情不太复杂的话,这没什么错。但我见过能把一个勇敢的人逼疯的怪物。如果我想保持整洁,我通常会编写一个充当守门员的类。无论我查看帖子,活动时间戳都会更新。我不知道你在说什么。用户活动ts会在每次页面加载时更新。帖子/论坛ts在每次评论/帖子/任何内容中都会更新。所以您知道上次加载页面的时间和上次更新对象的时间。你应该能够用这些信息获取未读的对象,对吗?如果post时间戳也会在视图上更新,那么它会将post注册为已读,即使其他人阅读了它们。如果不是的话,在用户加载第一页后,每一篇文章都会被“阅读”。你仍然需要以某种方式标记阅读对象。如果用户活动时间戳大于线程的上次更新时间戳,则它将显示为“已读”,即使它从未打开过。啊,是的,我现在明白你的意思了。很抱歉