这真的很难解释,但我会尽我所能。
我有一个名为arrayoftransactioncs的数组,它包含4个字符串*扫描,MEMBER_ID,餐厅,时间,付费。如果扫描是付费的,它将被定义为1,如果不是,它将具有0。
所以我问题的主要问题是,我如何在60分钟内得到包含payd=0但尚未pay=1的扫描。我将举一个例子。
示例A在本示例中,在20分钟内有3次扫描来自同一家咖啡馆x。前2次定义为payd=0,最后一次定义为Payd=1。因为在60分钟内有相同的member_id和餐厅的payd=1,我不想要任何扫描
Scan A 1635752 Cafe X 17-11-2013 21:00 Paid 1
Scan B 1635752 Cafe X 17-11-2013 20:50 Paid 0
Scan C 1635752 Cafe X 17-11-2013 20:40 Paid 0
示例B在本示例中,在60分钟内,同一会员、同一餐厅也进行了3次扫描,但所有扫描都被定义为payd=0。因为在这个例子中没有payd=1,所以我想把它们放在一个数组中。这就是我们的目标但这里有一个转折点,因为有不止一个扫描要使用,我只想要这个例子中的最新扫描,这意味着只有扫描a可以使用
Scan A 1635752 Cafe X 17-11-2013 21:00 Paid 0
Scan B 1635752 Cafe X 17-11-2013 20:50 Paid 0
Scan C 1635752 Cafe X 17-11-2013 20:40 Paid 0
所以我希望你们能理解我的问题。如果没有相同的member_id的付费=1扫描,我需要付费=0扫描,餐厅在60分钟内
这就是我的尝试。
我循环我的数组2次,然后检查相同的member_id(cardid)和restaurants是否相等,如果是,则检查时间。如果是白色的60分钟,则将扫描标记为双
foreach($arrayoftransationcs as $key => $array)
{
$time=$arrayoftransationcs[$key]['created'];
$cardid = $arrayoftransationcs[$key]['cardid'];
$restaurant_id = $arrayoftransationcs[$key]['restaurant_id'];
if(isset($arrayoftransationcs[$key]))
{
foreach($arrayoftransationcs as $k1=>$v1)
{
$time2=$arrayoftransationcs[$k1]['created'];
if($key<$k1)
{
if($arrayoftransationcs[$k1]['cardid']==$cardid && $arrayoftransationcs[$k1]['restaurant_id']==$restaurant_id)
{
if(compare($time,$time2))
{
$arrayoftransationcs[$key]['error'] = 'double';
$arrayoftransationcs[$k1]['error'] = 'double';
}
}
}
}
}
}
在这里查时间。
function compare($firsttime, $secondtime)
{
$interval = $firsttime-$secondtime;
$dif=round(abs($interval) / 60);
if ($dif < 60 || $dif < -60 )
{
if ($dif!==0)
{
return true;
}
else
{
return false;
}
}
}
这是我在payd=0之后进行过滤的地方,并且在错误字段中不包含任何内容。
foreach ($arrayoftransationcs as $key)
{
if($key['paid'] == 0 && empty($key['error']))
{
$ids[] = $key['transactionid'];
}
}
但我不确定这是正确的方法,我用代码做到了。从技术上讲,我选择了所有具有相同会员号的扫描,字段中有"双"错误的餐厅,如果它是付费的=1或0,也没关系。。我认为这是不对的。
所以我在这里错过了一些东西,检查这里是否有付费=0扫描,如果有,检查在接下来的60分钟内是否有付费=1扫描,具有相同的medlem_id和restaurant。如果是,则将其标记为双打。
这就是你的做法:
<?php
// Data Source
$arrayoftransationcs = array(
array(
'transactionid' => 16148,
'cardid' => 10010234,
'created' => 1380650784,
'restaurant_id' => 32089,
'paid' => 1
),
array(
'transactionid' => 16552,
'cardid' => 10010241,
'created' => 1381522288,
'restaurant_id' => 41149,
'paid' => 1
),
array(
'transactionid' => 16936,
'cardid' => 10010440,
'created' => 1386247655,
'restaurant_id' => 47897,
'paid' => 0
),
array(
'transactionid' => 16808,
'cardid' => 10010557,
'created' => 1382361447,
'restaurant_id' => 43175,
'paid' => 0
),
array(
'transactionid' => 18932,
'cardid' => 10010440,
'created' => 1386247655,
'restaurant_id' => 47897,
'paid' => 1
)
);
// Helper Function
function getUnpaidWithinHour($transactions) {
$unpaid_transactions = array();
$time_now = time();
foreach ($transactions as $transaction) {
if ($transaction['paid']) continue;
if (($time_now - $transaction['created']) < 3600 && !$transaction['paid']) {
$unpaid_transactions[] = $transaction;
}
}
return $unpaid_transactions;
}
// Test
$unpaid_transactions = getUnpaidWithinHour($arrayoftransationcs);
echo "<pre>";
print_r($unpaid_transactions);
echo "<pre>";
?>
输出:
Array
(
[0] => Array
(
[transactionid] => 16936
[cardid] => 10010440
[created] => 1386247655
[restaurant_id] => 47897
[paid] => 0
)
)
为了测试这是否有效,我编辑了事务16936,使其时间戳为5分钟前,并运行了该函数。代码正确检测到该事务。
您可以自己尝试,也可以使用自己的数据源。
让我们简单一点,你的问题是:如果在60分钟内没有相同member_id的payd=1,则查找payd=0扫描,因为缺乏测试数据,所以我将在下面用php风格的自然语言描述:
make an empty arrayPaid
foreach (all data) {
if time passed greater than 60min, continue;
if paid
add member_id in arrayPaid: arrayPaid[member_id] = something
continue;
if unpaid and arrayPaid[member_id] is not set
this is the data you want
}
逻辑清晰,易于编写真正的代码。一件重要的事情是,你的数据需要按时间顺序排列。
我通过这样做找到了答案。
foreach ($results->result_array() as $filterofresults)
{
if($filterofresults['paid'] == 1)
{
$arrayoftransationcs1[]=$filterofresults;
}
if($filterofresults['paid'] == 0)
{
$arrayoftransationcs[]=$filterofresults;
}
}
foreach($arrayoftransationcs as $key => $array)
{
$time=$arrayoftransationcs[$key]['created'];
$cardid = $arrayoftransationcs[$key]['cardid'];
$restaurant_id = $arrayoftransationcs[$key]['restaurant_id'];
if(isset($arrayoftransationcs[$key]))
{
foreach($arrayoftransationcs1 as $k1=>$v1)
{
$time2=$arrayoftransationcs1[$k1]['created'];
if($key<$k1)
{
if($arrayoftransationcs1[$k1]['cardid']==$cardid && $arrayoftransationcs1[$k1]['restaurant_id']==$restaurant_id)
{
if(compare($time,$time2))
{
$arrayoftransationcs[$key]['error'] = 'Dobbelt';
$arrayoftransationcs1[$k1]['error'] = 'Dobbelt';
}
}
}
}
}
}
foreach ($arrayoftransationcs as $key)
{
if($key['paid'] == 0 && empty($key['error']))
{
$samlet[] = get_all_data($key['transactionid']);
}
}