鍍金池/ 問答/PHP/ 求助,PHP處理三維數(shù)組

求助,PHP處理三維數(shù)組

原始數(shù)組:

$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' => ''
        ),
    ),
);

三維數(shù)組的要求是:三位數(shù)組的第三位維的相鄰的gettime鍵值的差如果大于600秒,就返回其sortid鍵的值。
處理后的數(shù)組如下:

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

多謝各位大牛!

回答
編輯回答
故林

看了要求和結(jié)果,怎么好像不太對(duì),為什么不是'10'=>array( array(1,3))

2017年6月24日 13:02
編輯回答
不歸路

首先你的答案都不對(duì),相鄰的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;
}

結(jié)果:

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"
    }
  }
}
2018年8月2日 07:58
編輯回答
何蘇葉

首先遍歷一下這個(gè)三維數(shù)組,在循環(huán)中判斷相鄰gettime鍵值的差,如果大于600秒,最后返回sortid鍵的值,就是這三個(gè)點(diǎn),第二個(gè)比較難點(diǎn).

2018年6月18日 01:35
編輯回答
敢試
[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]修改原數(shù)組
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;
}
2018年4月5日 21:41