我如何操作我的阵列,所以如果在60分钟内有一次扫描


How can I manipulate my array, so if there is a scan within 60min with the same

这真的很难解释,但我会尽我所能。

我有一个名为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']);
     }
  }