[英]PHP Loop through dynamic array
我有一个带有php后端的web应用程序。 每隔一定时间就需要对所有用户进行检查。 运行这些检查需要花费一些时间,更重要的是:它们不应在不存在的用户上执行。 从数据库接收用户,并且可以在运行检查的过程中进行更改。 我当前的解决方案是:
<?php
require_once 'databaseUtils.php';
$users = getUsersFromDatabase();
//Sample:
while(true) {
foreach(GetUsers() as &$user) {
//I'd rather not:
if(checkIfUserIsInDatabase($user) {
var_dump($user);
sleep(1); //Checking takes time...
}
}
echo "Going again in 5s!";
sleep(5); //Interval
}
function GetUsers() {
return $users;
}
//Called from outside
function removeUser($user) {
global $users;
removeUserFromDatabase($user);
if(($key = array_search($user, $users)) !== false) {
unset($users[$key]);
}
}
?>
但是我仍然在不必要的遍历遍历GetUsers()的用户。 有没有一种方法可以遍历数组的所有值,在其中可以从外部删除元素?
如果要检查每个用户是否仍在数据库中,则需要从数据库中查询他的信息,因此与检查数组中的每个项目相比,如果要花费更多的精力(如果这不是更多的资源花费)。
但是我建议将用户分配给较小的部分,而不是所有用户。 并逐份检查。
首先,您可能需要考虑重新设计整个业务逻辑。
不要使用无限循环 ( while(true)
) 和全局变量 ( global $users
)。
要遍历所有用户,您可以使用生成器概念并一个接一个地检索现有用户。 因此,在每次迭代期间,您只会从数据库中获取下一个用户:
function getUsersFromDatabase($db)
{
$id = 0;
while (($user = $db->query("SELECT * FROM `users` WHERE `id` > $id LIMIT 1"))) {
yield $user;
$id = $user->id;
}
}
foreach (getUsersFromDatabase($db) as $user) {
checkUser($user);
}
我不知道您的框架或数据库适配器的详细信息,因此代码段是通用的,应视为伪代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.