[英]PHP: iterate through array and assign a customer to a user, in turn
目的
每次操作員手動將客戶添加到程序時,他/她也會為客戶分配一個區域。
用戶很多,每個用戶都分配了一個或多個區域。
一旦操作員輸入了一個客戶並為其分配了一個區域,就應該將一個用戶分配給該客戶,但不總是相同的用戶,每次都必須是一個不同的用戶(基於area_customer表),並且必須依次(1,2,3,1,2,3,1,2 ...)。
因此,如果將3個用戶分配到一個區域,則首先將創建的客戶分配給第一個用戶,然后輸入新客戶並分配給第二個用戶,然后輸入第三個客戶並分配給第三個用戶。 此時,一切又重新開始。 如果創建了第四個客戶,則將第一個用戶分配給該客戶,依此類推。
細節
我有4個MySQL表:
Users
表具有唯一的ID user_id
和每個用戶的其他字段。
Areas
表具有唯一的ID area_id
和名稱字段。
Area_Users
表僅具有area_id
和user_id
,這是分配區域的位置,因此每個用戶都為其分配了一個或多個區域。
Customer
表具有唯一的標識customer_id
,具有area_id
(與Areas
表相關)和具有user_assigned_id
(與Users表相關)
我需要完成的工作:
每次將客戶添加到程序中時,負責人都會手動插入該客戶的所有數據,包括將客戶分配到的區域。
此時,在MySQL表Customer
插入了一行,但是應該以編程方式添加user_assigned_id
(而不是由人員手動添加)。
需要從Areas
表中計算將哪個user_id
放置在user_assigned_id
的選擇。 每次都應該是一個不同的人。
這是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 |
因此,區域#1被分配給用戶4和6,而區域#2被分配給1,2,3,5和6。(注意:用戶6被分配了2個區域)
此時,此人為區域#2創建了一條記錄,該記錄必須分配給用戶1,接下來要創建的記錄將進入用戶#2,然后是#3,然后是#5,然后是#6。 從#1再來一次。
區域#1相同,首先是用戶#4,然后是#6,然后是#4,然后是#6,依此類推...
我的想法是首先找到Area數據:
//Codeigniter
$areas_data = $this->db->get_where('areas', ['area_id' => 1]);
然后找出該區域有多少用戶:
$tot_users_area = $areas_data->num_rows();
然后,我可以遍歷它們,但是我怎么知道最后的任務是什么? 並且,在區域1的情況下,在用戶4進入6(或者可能是124)之后,我該如何進入下一個區域?
如果我理解正確,並且“客戶”表中的“ customer_id”字段是自動遞增的,則需要像您輸入的那樣在“客戶”表中檢查“最后的分配”。
獲得所有$ areas_data后:
$areas_data = $this->db->get_where('areas', ['area_id' => 1]);
遍歷“客戶”表中的每個對(user_id,區域),然后查看存在的對。 當找到不存在的一對時,添加它:
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);
}
}
這只是數組的簡單演示,而沒有使用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>";
}
}
}
?>
此時因為沒有用戶和customers..Using的ORM有一個簡單的解決方案..之間的多對一的關系,你可以考慮使用ORM包..(這對於這樣的情況下,提供reusuble解決方案) 的http:// www.krueckeberg.org/notes/relationships.html ..還要搜索關鍵字"on cascade delete"
和"on cascade insert"
..使用ORM和級聯將更加容易。“無需重新發明輪”..
區域和用戶之間存在多對多的關系。更改數據庫設計可能會為您提供幫助,並強烈建議您這樣做。在當前設計中,如果需要獲取所有區域該怎么辦?表區域中沒有主鍵。如果還需要使用日期獲取軌道分配怎么辦?在此解決方案中,您可以將一個日期字段添加到AssignedInto表中並保留軌道分配表等.AssignedInto表提供了用戶和區域之間的關系。
https://en.wikipedia.org/wiki/Many-to-many_(data_model)
http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561
ORM軟件包,稱為“教義”。
您真正要尋找的是ROUND ROBIN METHOD
。 分配客戶時,您必須圈出用戶。
你可以做什么
每當您要問客戶時,都必須在臨時表中再插入一個。
該臨時表跟蹤哪個是最后分配的用戶(userid)
以及該客戶的區域,當您再次與該客戶聯系時,您將首先查詢該臨時表以檢查最后分配的用戶,並遞增該用戶userid並分配客戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.