PHP循环通过动态数组

时间:2017-05-02 08:47:50

标签: php arrays database loops

我有一个带有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()中的用户不必要地循环。有没有办法循环遍历数组的所有值,其中元素可以从外部删除?

2 个答案:

答案 0 :(得分:1)

如果您想检查每个用户是否仍在数据库中,您需要从数据库中查询他的信息,因此比检查数组中的每个项目(如果不是更多的资源支出)需要更多的努力。

但我会建议让用户分成较小的部分,而不是所有用户。并逐个检查。

答案 1 :(得分:1)

首先,您可能需要考虑重写整个业务逻辑。

请勿使用无限循环while(true)和全局变量global $users)。

要遍历所有用户,您可以使用generator concept并逐个检索现有用户。因此,在每次迭代期间,您将只从数据库中获得下一个用户:

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);
}

我不知道您的框架或数据库适配器详细信息,因此代码段是通用的,应该被视为伪代码。