繁体   English   中英

PHP通过动态数组循环

[英]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.

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