【问题标题】:Skipping arrays in a multi-dimensional array during loop在循环期间跳过多维数组中的数组
【发布时间】:2015-10-15 04:55:30
【问题描述】:

假设我将代理存储在具有以下结构的多维数组中:

[Agent - 167] => Array
        (
            [0] => Array
                (
                    [0] => 2015-07-17 00:01:51.417080
                    [1] => Agent - 167
                    [2] => LOGIN
                )

            [1] => Array
                (
                    [0] => 2015-07-17 00:02:28.821206
                    [1] => Agent - 167
                    [2] => LOGOUT
                )

            [2] => Array
                (
                    [0] => 2015-07-17 00:02:37.257944
                    [1] => Agent - 167
                    [2] => LOGIN
                )

            [3] => Array
                (
                    [0] => 2015-07-21 07:16:51.457435
                    [1] => Agent - 167
                    [2] => LOGIN
                )
       [4] => Array
                (
                    [0] => 2015-07-21 07:20:51.016638
                    [1] => Agent - 167
                    [2] => LOGOUT
                )
    )

我想计算每个代理的每个LoginLogout 事件之间的时间差并获得汇总。这很简单,因为时间日志位于内部数组的第一个元素中,所以[0][0] = Time。该事件在第三个元素上。我的计算仅在以下事件为LOGOUT 且前一个事件为LOGIN 时有效。

但有时代理超时而不是注销连续记录两个 LOGIN 事件,我想跳过具有 LOGIN 事件的数组 IF 下一个数组也有LOGIN 事件并继续我的计算。

我正在使用下面的代码来执行我的计算:

  foreach ($pse_array as $value) {
        $total = 0;
        for ($i = 0; $i < count($value); $i+=2) {
            $srtTime = strtotime($value[$i][0]);
            $endTime = strtotime($value[$i + 1][0]);
            $interval = $endTime - $srtTime;
            $total += $interval;
        }
        echo gmdate("H:i:s", $total) . " Minutes <br>";
    }

我也知道我可以通过If statement 进行比较以检查事件是否符合我的标准,但我不确定如何跳过数组。

【问题讨论】:

  • 加timeuot时间可能更好?
  • @splash58 可能是,但我无法重新设计系统。
  • $pse_array 是来自 var_dump 的数组?还是$value?
  • @splash58 是的。是多维数组的最外层数组。
  • 先过滤数组,然后对过滤后的数组进行计算。这样代码看起来会干净很多。还需要检查在增加索引时不会超出数组长度。也可以在过滤器中执行此操作以删除最后一个不匹配的LOGIN

标签: php arrays loops multidimensional-array


【解决方案1】:
$timeout = strtotime('00:30') - strtotime('00:00');

foreach ($pse_array as $value) { // loop by user
    $total = 0;
    $login = false;                          // time of login  
    foreach ($value as $item)  {             // loop by entry
        if ($item[2] == 'LOGIN') {
           //if ($login) $total += $timeout; // two login successively
                                             // you can remove this
            $login = $item[0];               // save login time
            continue;
        }
        $srtTime = strtotime($login);        // if here, status = LOGOUT
        $login = false;                      // mark that previos was logout 
        $endTime = strtotime($item[0]);      // further your code
        $interval = $endTime - $srtTime;
        $total += $interval;                 // You receive interval in sec
    }
    echo $total/60 . " Minutes <br>";       
}

【讨论】:

  • 我还是不明白你在做什么。您要添加 30 分钟的超时时间?因为有些会话超过 30 分钟,所以会强制注销吗??
  • 我只在 login -login 情况下添加 $timeout。正如我所写的,你可以删除这一行
  • 如果您删除它,将保存新的登录值。所以,你跳过第一次登录
【解决方案2】:

经过几次尝试,设法找到了一个快速简便的解决方案

$pse_array = [ 'Agent - 167' => [
        [ 0 => '2015-07-17 00:01:51.417080',
            1 => 'Agent - 167',
            2 => 'LOGIN'
        ],
        [
            0 => '2015-07-17 00:02:28.821206',
            1 => 'Agent - 167',
            2 => 'LOGOUT'
        ],
        [
            0 => '2015-07-17 00:02:37.257944',
            1 => 'Agent - 167',
            2 => 'LOGIN'
        ],
        [
            0 => '2015-07-21 07:16:51.457435',
            1 => 'Agent - 167',
            2 => 'LOGIN'
        ],
        [
            0 => '2015-07-21 07:20:51.016638',
            1 => 'Agent - 167',
            2 => 'LOGOUT'
        ]
    ]
];


foreach ($pse_array as $value) {
    $total = 0;
    for ($i = 0; $i < count($value);
    ) /* $i+=2) */ {
        if ($value[$i][2] === "LOGIN" && $value[$i + 1][2] === "LOGIN") {
            $i+=1;
        } else {

            $srtTime = strtotime($value[$i][0]);
            $endTime = strtotime($value[$i + 1][0]);
            $interval = $endTime - $srtTime;
            $total += $interval;
            $i+=2;
        }
    }
    echo gmdate("H:i:s", $total) . " Minutes <br>";
}

工作箱:https://eval.in/406539

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2018-07-13
    相关资源
    最近更新 更多