Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何操作阵列,以便在60分钟内使用相同的_Php_Arrays_Algorithm - Fatal编程技术网

Php 如何操作阵列,以便在60分钟内使用相同的

Php 如何操作阵列,以便在60分钟内使用相同的,php,arrays,algorithm,Php,Arrays,Algorithm,这真的很难解释,但我会尽力的 我有一个名为ArrayOftTransationCs的数组,它包含4个字符串*扫描、会员ID、餐厅、时间、付费。如果支付了扫描费用,它将被定义为1,如果没有,它将有0 因此,我的问题的主要问题是,如何在60分钟内获得包含paid=0且未包含paid=1的扫描。我将给出一个示例 示例A在本例中,20分钟内有3次扫描来自同一个cafe x。前2次被定义为paid=0,最后一次被定义为paid=1。因为60分钟内有相同会员id和餐厅的paid=1,所以我不需要任何扫描 S

这真的很难解释,但我会尽力的

我有一个名为ArrayOftTransationCs的数组,它包含4个字符串*扫描、会员ID、餐厅、时间、付费。如果支付了扫描费用,它将被定义为1,如果没有,它将有0

因此,我的问题的主要问题是,如何在60分钟内获得包含paid=0且未包含paid=1的扫描。我将给出一个示例

示例A在本例中,20分钟内有3次扫描来自同一个cafe x。前2次被定义为paid=0,最后一次被定义为paid=1。因为60分钟内有相同会员id和餐厅的paid=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次扫描,但所有扫描都被定义为paid=0。因为在这个例子中没有paid=1,所以我希望它们在一个数组中。这就是目标。但这里有一个转折点,因为要使用的扫描不止一个,我只想在本例中使用最新的扫描,这意味着只能使用扫描a

所以我希望你能理解我的问题。我需要付费=0扫描,如果60分钟内没有相同会员id的付费=1扫描,餐厅

我就是这样尝试的

我将数组循环2次,然后检查同一成员id(cardid)和餐厅是否相等,如果是,则检查时间。如果为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';                         
                    }

                }
            }
        }
    }   
  }

但我不确定这是正确的方法,我是用代码做的。从技术上讲,我选择所有会员编号相同的扫描,字段中有“double”错误的餐厅,如果支付=1或0,则无所谓。。我认为这是不对的

所以我这里遗漏了一些东西,检查这里是否有付费=0扫描如果是,检查在接下来的60分钟内是否有付费=1扫描,有相同的medlem_id和餐厅。如果是,则将其标记为双倍。

这是您的操作方法:

<?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>";

?>
为了测试这是否有效,我将事务16936编辑为具有5分钟前的时间戳,然后运行该函数。代码正确地检测到该事务


您可以自己使用自己的数据源进行尝试。

让我们简单一点,您的问题是:如果在60分钟内没有相同成员id的paid=1,则查找paid=0扫描,因为缺少测试数据,所以我将在下面用php风格的自然语言进行描述:


逻辑清晰,易于编写真正的代码。一件重要的事情是,您的数据需要在desc中按时间排序。

我通过这样做找到了答案

foreach($results->result\u array()作为$filterfresults)
{
如果($filterofresults['paid']==1)
{
$ArrayOftTransactionCS1[]=$filterofresults;
}
如果($filterofresults['paid']==0)
{
$ArrayOftTransactions[]=$filterofresults;
}
}
foreach($ArrayOftTransationCs作为$key=>$array)
{
$time=$arrayoftransationcs[$key]['created'];
$cardid=$ArrayOftTransactionCS[$key]['cardid'];
$restaurant_id=$arrayoftransationcs[$key]['restaurant_id'];
if(isset($ARRAYOFTRANSIONCS[$key]))
{
foreach($ArrayOftTransactionCS1作为$k1=>$v1)
{
$time2=$ARRAYOFTRANSIONCS1[$k1]['created'];

如果($KEYOU
print_r()
your array并将其发布到某处(pastebin?)或此处?我已将我的数组发布到pastebin中:抱歉,这太疯狂了。无法正确查看数组结构。能否尝试此操作并将其再次发布到pastebin?
echo”“;print_r($ArrayOftTransationcs);echo“”
Ohh,我的错..新版本。更好。简而言之,从这个数组中,您试图确定谁在1小时内没有付款?如果您在数组中添加更多示例数组('transactionid'=>18932,'cardid'=>10010440,'created'=>1386243624,'restaurant\u id'=>47897,'paid'=>1)然后你输出16936,不应该工作,因为60分钟内有一个付费的=1,成员id相同,餐馆。但根据你的代码,它工作。仍然是相同的@Latheesan。如果有多个未付费扫描,60分钟内没有付费的=1,成员id相同,餐馆相同,两个未付费扫描都会出现。对不起,我不理解这里的问题是什么。你能再简单地解释一下你的要求吗?我再次更新了我的代码。在这里,我有两个条目(1693618932)都有相同的时间戳(在过去的5分钟内),但18932被标记为已支付。当我运行脚本时,我只得到一个条目-正如预期的那样。因为18932被标记为已支付,那么它意味着16936不应该出现。原因是,条目16936没有在那里支付交易,但几分钟后,成员决定再次支付,这次交易成功(标记为已支付)这就是为什么我只想要那些未付款的条目(60分钟内,使用相同的会员卡和餐厅),如果你看我发布的内容,有两个例子。(A和B)正如你在示例B中所看到的,那么同一位成员曾经到X咖啡馆吃饭。他尝试了3次付款,但都没有通过。因此,只显示最后一次。但是如果你看示例A,那么一位成员也尝试了3次付款,前2次没有通过,但最后一次效果很好。因此,没有一次这3个应该出现这里是我的数组pastebin.com/ni95uf5s请给我几分钟。
 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;
        }
     }
   }
  foreach ($arrayoftransationcs as $key) 
  {
    if($key['paid'] == 0 && empty($key['error']))
    {
            $ids[] = $key['transactionid'];

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

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