PHP:迭代数组并将用户分配给用户

时间:2015-12-26 23:17:10

标签: php mysql arrays codeigniter

目的

每次操作员手动将客户添加到程序时,他/她也会为客户分配一个区域。

有许多用户,每个用户都分配了一个或多个区域。

一旦操作员进入客户并为其分配一个区域,就应该为该客户分配一个用户,但不一定是同一个用户,每次都必须是一个不同的用户(基于area_customer表)并且必须轮流(1,2,3,1,2,3,1,2 ......)。

因此,如果将3个用户分配到某个区域,则首先将创建的客户分配给第一个用户,稍后输入新客户并分配给第二个用户,输入第三个客户并分配给第三个用户用户。此时全部重新开始。如果创建了第四个客户,则将第一个用户分配给此用户,等等。

详情

我有4个MySQL表:

  • 用户
  • 领域
  • Area_Users
  • 客户

Users表具有唯一标识user_id以及每个用户的其他字段。

Areas表格具有唯一ID area_id和名称字段。

Area_Users表只有area_iduser_id,这是区域分配的位置,因此每个用户都为自己分配了一个或多个区域。

Customer表格具有唯一ID customer_id,有一个area_id(与Areas表相关)并且有一个user_assigned_id(与用户相关)表)

我需要完成的任务:

每次将客户添加到程序中时,负责人都会手动插入该客户的所有数据,包括客户所在的区域。

此时在MySQL表Customer中插入一行,但user_assigned_id应该以编程方式添加(而不是由人手动添加)。

需要从user_id表中选择要user_assigned_id放置Areas Areas。每次都应该是一个不同的人。

这是| area_id | name | ------------------------- | 1 | Z1 | | 2 | Z2 | 表:

Area_Users

所以,让我们说这是| area_id | user_id | ------------------------- | 1 | 4 | | 1 | 6 | | 2 | 1 | | 2 | 2 | | 2 | 3 | | 2 | 5 | | 2 | 6 | 表:

//Codeigniter 
$areas_data = $this->db->get_where('areas', ['area_id' => 1]);

因此,区域#1分配给用户4和6,而区域#2分配给1,2,3,5和6.(注意:用户6分配了2个区域)

此时,此人为区域#2创建记录,必须将其分配给用户1,将创建的下一条记录将转到用户#2,而不是#3,然后是#5,然后是#6。而不是#1。

区域#1相同,第一个用户#4,然后是#6,然后是#4,然后是#6,依此类推......

我的想法是首先找到区域数据:

$tot_users_area = $areas_data->num_rows();

然后查找这些区域中有多少用户:

.indexOf

然后我可以遍历它们,但我怎么知道最后的任务是什么?并且,在区域#1的情况下,在用户#4来到#6(或者可能是#124)之后,我该如何进入下一个?

3 个答案:

答案 0 :(得分:1)

如果我理解正确,并且Customers表中的customer_id字段是自动递增的,那么您需要检查Customers表中的"最后一次分配",如您所说。 / p>

获得所有$ areas_data:

$areas_data = $this->db->get_where('areas', ['area_id' => 1]);

遍历Customers表中的每个(user_id,area)对并查看存在的内容。当您找到不存在的对时,请添加它:

foreach($areasdata as $key => $areaDatum) {
    $result = $this->db->get_where('customers', array('area_id' => $areaDatum['area_id'], 'user_assigned_id' => $areaDatum['user_id']));
    if(!result) {
        $data = array('area_id' => $areaDatum['area_id'], 'user_assigned_id' = > $areaDatum['user_id']);
        $this->db->insert('customers', $data);
    }
}

答案 1 :(得分:1)

这只是一个简单的数组演示,没有使用codeigniter和数据库..

<?php
$customers=[1,2,3,4,5,6,7];
$users=[1,2,3,4];
$usercustomers = [];
$userslen=count($users);


foreach($customers as $customer)
{
    if($customer > $userslen){

        $usercustomers = array('user'     => $customer%$userslen,
                               'customer' => $customer);
        var_dump($usercustomers);
        echo "<br>";

    }
    foreach($users as $user)
    {

        if($customer%$user==0 && $customer==$user){

            $usercustomers = array('user'     => $user,
                                   'customer' => $customer);

            var_dump($usercustomers);
            echo "<br>";
         }

    }

}



?>

此时您可以考虑使用ORM包(为此类情况提供可重复使用的解决方案)。因为用户和客户之间存在多对一关系。使用ORM有一个简单的解决方案.. { {3}} ..同时搜索关键字"on cascade delete""on cascade insert" ..使用ORM和级联会更容易..“没有必要重新发明轮子”..

区域和用户之间存在多对多的关系。更改数据库设计可能对您有所帮助,并强烈推荐。在您当前的设计中,如果需要获取所有区域,该怎么办?没有主键表区域。如果你需要使用日期获得跟踪分配怎么办?在这个解决方案中你可以在AssignedInto表中添加一个日期字段并保持跟踪assignemts等.AssignedInto表提供了用户和区域之间的关系..

http://www.krueckeberg.org/notes/relationships.html

https://en.wikipedia.org/wiki/Many-to-many_(data_model)

http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

名为doctrine的ORM包..

enter image description here

答案 2 :(得分:1)

您实际需要的是ROUND ROBIN METHOD。您必须在分配客户时圈选用户。

您可以做什么

每当您向客户提出要求时,您都必须在临时表中进行另一次插入。

此临时表跟踪分配的最后一个用户(userid)以及该客户的区域,当您再次向客户发送消息时,您将首先查询此临时表以检查哪个用户是最后一个分配并只增加该用户ID并分配客户。