Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.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 循环期间跳过多维数组中的数组_Php_Arrays_Loops_Multidimensional Array - Fatal编程技术网

Php 循环期间跳过多维数组中的数组

Php 循环期间跳过多维数组中的数组,php,arrays,loops,multidimensional-array,Php,Arrays,Loops,Multidimensional Array,假设我将代理存储在具有以下结构的多维数组中: [Agent - 167] => Array ( [0] => Array ( [0] => 2015-07-17 00:01:51.417080 [1] => Agent - 167 [2] => LOGIN

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

[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
                )
    )
我想计算每个代理的每个
登录
注销
事件之间的时间差,并获得聚合值。这很简单,因为时间日志位于内部数组的第一个元素中,所以
[0][0]=time
。事件发生在第三个元素上。我的计算仅在以下事件为退出
且前一事件为登录
时有效

但是,有时代理超时,而不是连续记录两个
LOGIN
事件的注销,我想跳过包含
LOGIN
event的数组,如果下一个数组也包含
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>";
    }
foreach($pse\u数组作为$value){
$total=0;
对于($i=0;$i”;
}
我还知道,我可以使用
if语句进行比较以检查事件是否符合我的标准,但我不确定如何跳过该数组。

$timeout=strotime('00:30')-strotime('00:00');
$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>";       
}
foreach($pse_数组作为$value){//按用户循环 $total=0; $login=false;//登录时间 foreach($value as$item){//按条目循环 如果($item[2]=“LOGIN”){ //if($login)$total+=$timeout;//连续两次登录 //你可以删除这个 $login=$item[0];//节省登录时间 继续; } $srtTime=strotime($login);//如果在这里,状态=注销 $login=false;//标记previos已注销 $endTime=strottime($item[0]);//进一步了解您的代码 $interval=$endTime-$srtTime; $total+=$interval;//以秒为单位接收间隔 } echo$total/60.“分钟
”; }
经过几次尝试,终于找到了一个快速简便的解决方案

$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>";
}
$pse\u数组=['Agent-167'=>[
[ 0 => '2015-07-17 00:01:51.417080',
1=>“代理-167”,
2=>“登录”
],
[
0 => '2015-07-17 00:02:28.821206',
1=>“代理-167”,
2=>“注销”
],
[
0 => '2015-07-17 00:02:37.257944',
1=>“代理-167”,
2=>“登录”
],
[
0 => '2015-07-21 07:16:51.457435',
1=>“代理-167”,
2=>“登录”
],
[
0 => '2015-07-21 07:20:51.016638',
1=>“代理-167”,
2=>“注销”
]
]
];
foreach($pse\u数组作为$value){
$total=0;
对于($i=0;$i”;
}

工作箱:

也许最好添加timeuot time?@splash58可能是,但我无法重新设计系统。$pse\u数组是var\u dump中的数组吗?还是美元价值?@splash58是的。它是多维数组的最外层数组。请先过滤数组,然后对过滤后的数组进行计算。这样代码看起来会更干净。还需要检查在增加索引时是否超出了数组长度。也可以在筛选器中执行此操作,以删除没有匹配项的上次登录名。我仍然不明白您要做什么。你要加30分钟的超时时间?由于某些会话超过30分钟,因此将强制注销??我仅在登录-登录情况下添加$timeout。你可以删除这一行,就像我写的那样。如果你删除它,login的新值将保存。所以,你跳过第一次登录让我们看看。