求助,PHP处理三维数组

原始数组:

$arr = Array(
    '11' => Array(
        '1' => Array(
            'sortid'   => '6',
            'driverid' => '1003',
            'carsid'   => '11',
            'lineid'   => '2',
            'gettime'  => '2018-01-19 10:00:00',
            'comments' => ''
        ),
        '2' => Array(
            'sortid'   => '2',
            'driverid' => '1000',
            'carsid'   => '11',
            'lineid'   => '1',
            'gettime'  => '2018-01-19 10:03:31',
            'comments' => ''
        ),
        '4' => Array(
            'sortid'   => '9',
            'driverid' => '1001',
            'carsid'   => '11',
            'lineid'   => '5',
            'gettime'  => '2018-01-19 12:48:54',
            'comments' => ''
        ),
        '6' => Array(
            'sortid'   => '4',
            'driverid' => '1001',
            'carsid'   => '11',
            'lineid'   => '2',
            'gettime'  => '2018-01-19 14:47:50',
            'comments' => ''
        ),
        '7' => Array(
            'sortid'   => '5',
            'driverid' => '1001',
            'carsid'   => '11',
            'lineid'   => '2',
            'gettime'  => '2018-01-19 14:48:07',
            'comments' => ''
        ),
        '8' => Array(
            'sortid'   => '7',
            'driverid' => '1006',
            'carsid'   => '11',
            'lineid'   => '5',
            'gettime'  => '2018-01-19 14:48:29',
            'comments' => ''
        ),
        '10' => Array(
            'sortid'   => '10',
            'driverid' => '1003',
            'carsid'   => '11',
            'lineid'   => '5',
            'gettime'  => '2018-01-19 14:49:05',
            'comments' => ''
        ),
    ),
    '10' => Array(
        '3' => Array(
            'sortid'   => '1',
            'driverid' => '1000',
            'carsid'   => '10',
            'lineid'   => '1',
            'gettime'  => '2018-01-19 11:47:15',
            'comments' => ''
        ),
        '5' => Array(
            'sortid'   => '3',
            'driverid' => '1000',
            'carsid'   => '10',
            'lineid'   => '1',
            'gettime'  => '2018-01-19 14:47:40',
            'comments' => ''
        ),
        '12' => Array(
            'sortid'   => '12',
            'driverid' => '1001',
            'carsid'   => '10',
            'lineid'   => '1',
            'gettime'  => '2018-01-19 14:49:17',
            'comments' => ''
        ),
    ),
    '12' => Array(
        '9' => Array(
            'sortid'   => '8',
            'driverid' => '1001',
            'carsid'   => '12',
            'lineid'   => '5',
            'gettime'  => '2018-01-19 14:48:46',
            'comments' => ''
        ),
        '11' => Array(
            'sortid'   => '11',
            'driverid' => '1006',
            'carsid'   => '12',
            'lineid'   => '1',
            'gettime'  => '2018-01-19 14:49:12',
            'comments' => ''
        ),
    ),
    '13' => Array(
        '13' => Array(
            'sortid'   => '13',
            'driverid' => '1001',
            'carsid'   => '12',
            'lineid'   => '5',
            'gettime'  => '2018-01-19 12:48:46',
            'comments' => ''
        ),
        '14' => Array(
            'sortid'   => '14',
            'driverid' => '1006',
            'carsid'   => '12',
            'lineid'   => '1',
            'gettime'  => '2018-01-19 14:49:12',
            'comments' => ''
        ),
    ),
);

三维数组的要求是:三位数组的第三位维的相邻的gettime键值的差如果大于600秒,就返回其sortid键的值。
处理后的数组如下:

$arrs = array(
    '11' => array(
        array(6,2),
        array(4,5,7,10),
    ),
    '10' => array(
        array(3,12),
        ),
    '12' => array(
        array(8,11)
    ),
);

多谢各位大牛!

阅读 3.3k
4 个回答
[1]保留key
$aDelArr = [];
foreach($arr as $key => $aFValue)
{
    $i = 0;
    $iPreTime = 0;
    foreach($aFValue as $iNode => $aV)
    {
        $iTime = strtotime($aV['gettime']);
        $iSubTime = $iTime - $iPreTime;
        if($iSubTime > 600 && !empty($aDelArr[$key][$i]))
        {
            $i++;
        }
        $aDelArr[$key][$i][$iNode] = $aV['sortid'];
        $iPreTime = $iTime;
    }
}
[2]修改原数组
foreach($arr as $key => &$aValue)
{
    $aTemp = [];
    $iPreTime = 0;
    foreach($aValue as $aV)
    {
        $iTime = strtotime($aV['gettime']);
        $iSubTime = $iTime - $iPreTime;
        if($iSubTime > 600)
        {
            $aTemp[] = [];
        }
        $aTemp[count($aTemp) - 1][] = $aV['sortid'];
        $iPreTime = $iTime;
    }
    $aValue = $aTemp;
}
新手上路,请多包涵

看了要求和结果,怎么好像不太对,为什么不是'10'=>array( array(1,3))

首先遍历一下这个三维数组,在循环中判断相邻gettime键值的差,如果大于600秒,最后返回sortid键的值,就是这三个点,第二个比较难点.

首先你的答案都不对,相邻的gettime差值超过600s,4,5, 7 差值超过600?
代码:

function generate_special_rule_arr($three_dimensional_arr) {
    $return_arr = [];    
    foreach ($three_dimensional_arr as $key => $arr) {
        $insert_arr = [];
        $insert_index = 0;
        sort($arr, SORT_NUMERIC );
        foreach ($arr as $index => $base_value) {
            if (
                (isset($arr[$index + 1]) && abs(strtotime($base_value['gettime']) - strtotime($arr[$index + 1]['gettime'])) > 600)
                || (isset($arr[$index - 1]) && abs(strtotime($base_value['gettime']) - strtotime($arr[$index - 1]['gettime'])) > 600)    
            ) {
                $insert_arr[$insert_index][] = $base_value['sortid'];
            } else {
                $insert_index++;    
            }
        }
        if (!empty($insert_arr)) {
            $return_arr[$key] = $insert_arr;
            $insert_arr = [];
        }
    } 
    return $return_arr;
}

结果:

array(3) {
  [11] =>
  array(1) {
    [0] =>
    array(4) {
      [0] =>
      string(1) "6"
      [1] =>
      string(1) "2"
      [2] =>
      string(1) "9"
      [3] =>
      string(1) "4"
    }
  }
  [10] =>
  array(1) {
    [0] =>
    array(2) {
      [0] =>
      string(1) "1"
      [1] =>
      string(1) "3"
    }
  }
  [13] =>
  array(1) {
    [0] =>
    array(2) {
      [0] =>
      string(2) "13"
      [1] =>
      string(2) "14"
    }
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题