首頁  >  問答  >  主體

確定每個 PhaseId 的持續時間

我有以下陣列:

array (size=8)
  0 => 
    array (size=5)
      'entity_id' => int 571962
      'time' => int 1671101084788
      'time to datetime' => string '2022-12-15 11:44:44' (length=19)
      'PhaseId_new' => string 'Close' (length=5)
      'PhaseId_old' => string 'Accept' (length=6)
  1 => 
    array (size=5)
      'entity_id' => int 571962
      'time' => int 1671100537178
      'time to datetime' => string '2022-12-15 11:35:37' (length=19)
      'PhaseId_new' => string 'Accept' (length=6)
      'PhaseId_old' => string 'Fulfill' (length=7)
  2 => 
    array (size=5)
      'entity_id' => int 571962
      'time' => int 1671100012012
      'time to datetime' => string '2022-12-15 11:26:52' (length=19)
      'PhaseId_new' => string 'Fulfill' (length=7)
      'PhaseId_old' => string 'Review' (length=6)
  3 => 
    array (size=5)
      'entity_id' => int 571962
      'time' => int 1671099984979
      'time to datetime' => string '2022-12-15 11:26:24' (length=19)
      'PhaseId_new' => string 'Review' (length=6)
      'PhaseId_old' => string 'Accept' (length=6)
  4 => 
    array (size=5)
      'entity_id' => int 571962
      'time' => int 1671099802675
      'time to datetime' => string '2022-12-15 11:23:22' (length=19)
      'PhaseId_new' => string 'Accept' (length=6)
      'PhaseId_old' => string 'Fulfill' (length=7)
  5 => 
    array (size=5)
      'entity_id' => int 571962
      'time' => int 1671027321749
      'time to datetime' => string '2022-12-14 15:15:21' (length=19)
      'PhaseId_new' => string 'Fulfill' (length=7)
      'PhaseId_old' => string 'Approve' (length=7)
  6 => 
    array (size=5)
      'entity_id' => int 571962
      'time' => int 1671011168777
      'time to datetime' => string '2022-12-14 10:46:08' (length=19)
      'PhaseId_new' => string 'Approve' (length=7)
      'PhaseId_old' => string 'Log' (length=3)
  7 => 
    array (size=5)
      'entity_id' => int 571962
      'time' => int 1671011166077
      'time to datetime' => string '2022-12-14 10:46:06' (length=19)
      'PhaseId_new' => string 'Log' (length=3)
      'PhaseId_old' => null

我使用 entity_id 重新分組了每個子數組:

$result = array();
foreach ($data as $element) {
    //var_dump($element);
    $result[$element['entity_id']][] = $element;
}

哪個輸出我:

array (size=1)
  571962 => 
    array (size=8)
      0 => 
        array (size=5)
          'entity_id' => int 571962
          'time' => int 1671101084788
          'time to datetime' => string '2022-12-15 11:44:44' (length=19)
          'PhaseId_new' => string 'Close' (length=5)
          'PhaseId_old' => string 'Accept' (length=6)
      1 => 
        array (size=5)
          'entity_id' => int 571962
          'time' => int 1671100537178
          'time to datetime' => string '2022-12-15 11:35:37' (length=19)
          'PhaseId_new' => string 'Accept' (length=6)
          'PhaseId_old' => string 'Fulfill' (length=7)
      2 => 
        array (size=5)
          'entity_id' => int 571962
          'time' => int 1671100012012
          'time to datetime' => string '2022-12-15 11:26:52' (length=19)
          'PhaseId_new' => string 'Fulfill' (length=7)
          'PhaseId_old' => string 'Review' (length=6)
      3 => 
        array (size=5)
          'entity_id' => int 571962
          'time' => int 1671099984979
          'time to datetime' => string '2022-12-15 11:26:24' (length=19)
          'PhaseId_new' => string 'Review' (length=6)
          'PhaseId_old' => string 'Accept' (length=6)
      4 => 
        array (size=5)
          'entity_id' => int 571962
          'time' => int 1671099802675
          'time to datetime' => string '2022-12-15 11:23:22' (length=19)
          'PhaseId_new' => string 'Accept' (length=6)
          'PhaseId_old' => string 'Fulfill' (length=7)
      5 => 
        array (size=5)
          'entity_id' => int 571962
          'time' => int 1671027321749
          'time to datetime' => string '2022-12-14 15:15:21' (length=19)
          'PhaseId_new' => string 'Fulfill' (length=7)
          'PhaseId_old' => string 'Approve' (length=7)
      6 => 
        array (size=5)
          'entity_id' => int 571962
          'time' => int 1671011168777
          'time to datetime' => string '2022-12-14 10:46:08' (length=19)
          'PhaseId_new' => string 'Approve' (length=7)
          'PhaseId_old' => string 'Log' (length=3)
      7 => 
        array (size=5)
          'entity_id' => int 571962
          'time' => int 1671011166077
          'time to datetime' => string '2022-12-14 10:46:06' (length=19)
          'PhaseId_new' => string 'Log' (length=3)
          'PhaseId_old' => null

現在我需要計算每個階段的持續時間(記錄、批准、履行、接受、審核)。

例如:

日誌:1671011168777 - 1671011166077 = 2700

#批准:1671027321749 - 1671011168777 = 16152972

實作:(1671100537178 - 1671100012012) (1671099802675 - 1671027321749) = 73006092

##接受:(1671101084788 - 1671100537178) (1671099984979 - 1671099802675) = 729914

評論:1671100012012 - 1671099984979 = 27033

#我能夠使用以下方法解析每個階段:

foreach($result as $key => $val){
    //var_dump($key);
    foreach($val as $key2 => $val2){
        if($val2['PhaseId_new'] == 'Fulfill' or $val2['PhaseId_old'] == 'Fulfill'){

           // var_dump($val2);
        }
    }
}

但是我不清楚如何計算每個階段的持續時間。

預期結果如下:

array (size=1)
  571962 => 
    array (size=8)
          'Log' => int 2700
          'Approve' => int 16152972
          'Fulfill' => int 73006092
          'Accept' => int 729914
          'Review' => int 27033

PHP線上:https://onlinephp.io/c/2270e

工作流程:

P粉448346289P粉448346289378 天前430

全部回覆(2)我來回復

  • P粉029327711

    P粉0293277112023-09-09 15:56:38

    嘗試這樣的事情。

    //group by entity_id
    $data_grouped = [];
    foreach($data as $element) {
      $data_grouped[$element['entity_id']][] = $element;
    }
    
    $entity_phases = [];
    //get all phases and their times
    foreach ($data_grouped as $entity_id => $elements) {
      foreach ($elements as $element) {
        if ($element['PhaseId_new']) {
          $entity_phases[$entity_id][$element['PhaseId_new']][] = $element['time'];
        }
        if ($element['PhaseId_old']) {
          $entity_phases[$entity_id][$element['PhaseId_old']][] = $element['time'];
        }
      }
    }
    
    $result = [];
    //iterate all phases and calculate time diffs
    foreach ($entity_phases as $entity_id => $phases) {
      foreach ($phases as $key => $values) {
        if (!isset($result[$entity_id][$key])) {
          $result[$entity_id][$key] = 0;
        }
        //iterate in chunks of two elements
        foreach (array_chunk($values, 2) as $value) {
          //continue if only one value is found (e.g. for "Close")
          if (!isset($value[1])) {
            continue;
          }
          $result[$entity_id][$key] = $result[$entity_id][$key] + $value[0] - $value[1];
        }
      }
    }
    var_dump($result);

    這給你:

    array(1) {
      [571962]=>
      array(6) {
        ["Close"]=>
        int(0)
        ["Accept"]=>
        int(729914)
        ["Fulfill"]=>
        int(73006092)
        ["Review"]=>
        int(27033)
        ["Approve"]=>
        int(16152972)
        ["Log"]=>
        int(2700)
      }
    }

    回覆
    0
  • P粉587970021

    P粉5879700212023-09-09 00:02:52

    好吧,這花了我比我想要的更長的時間,但我得到了結果。首先是程式碼:

    $entityPhases = [];
    foreach ($data as $element) {
        $entityPhases[$element['entity_id']][] = $element;
    }
    
    $durations = [];
    $oldPhases = [];
    foreach ($entityPhases as $phases) {
        foreach(array_reverse($phases) as $phase) {
            if ($phase['PhaseId_old']) {
                $oldPhaseName = $phase['PhaseId_old'];
                $duration = $phase['time'] - $oldPhases[$oldPhaseName]['time'];
                $durations[$oldPhaseName] = ($durations[$oldPhaseName] ?? 0) + $duration;
            }   
            $oldPhases[$phase['PhaseId_new']] = $phase;
        }
    }
    
    print_r($durations);

    請參閱:https://onlinephp.io/c/92d7f

    #結果是:

    Array
    (
        [Log] => 2700
        [Approve] => 16152972
        [Fulfill] => 73006092
        [Accept] => 729914
        [Review] => 27033
    )

    現在解釋一下:

    首先,您的資料數組看起來是顛倒的,因此我使用 array_reverse() 來解決它。這裡的假設是存在邏輯順序。

    由於可能需要將多個週期相加,因此我使用一個名為 $durations 的陣列來將它們相加。

    然後在內部循環中,如果有舊的階段 ID,我可以計算持續時間並將其相加。最後我記得舊的階段,因為我在循環的下一個迭代中需要它。

    我還重命名了很多東西,使其名稱能夠傳達變數的內容。

    回覆
    0
  • 取消回覆