Maison  >  Questions et réponses  >  le corps du texte

Déterminer la durée de chaque PhaseId

J'ai le tableau suivant :

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

J'ai regroupé chaque sous-tableau en utilisant entity_id :

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

Quelle sortie moi :

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

Maintenant, je dois calculer la durée de chaque étape (enregistrer, approuver, exécuter, accepter, réviser).

Par exemple :

Journal : 1671011168777 - 1671011166077 = 2700

Approuvé :1671027321749 - 1671011168777 = 16152972

Mise en œuvre :(1671100537178 - 1671100012012) + (1671099802675 - 1671027321749) = 73006092

Accepté :(1671101084788 - 1671100537178) + (1671099984979 - 1671099802675) = 729914

Commentaires : 1671100012012 - 1671099984979 = 27033

J'ai pu analyser chaque étape en utilisant :

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);
        }
    }
}

Mais je ne sais pas comment calculer la durée de chaque étape.

Les résultats attendus sont les suivants :

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

PHP en ligne : https://onlinephp.io/c/2270e

Flux de travail :

P粉448346289P粉448346289378 Il y a quelques jours431

répondre à tous(2)je répondrai

  • P粉029327711

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

    Essayez quelque chose comme ça.

    //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);

    Le voici pour vous :

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

    répondre
    0
  • P粉587970021

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

    D'accord, cela m'a pris plus de temps que je le voulais, mais j'ai obtenu les résultats. D'abord le code :

    $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);

    Voir : https://onlinephp.io/c/92d7f

    Le résultat est :

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

    Maintenant, expliquez :

    Tout d'abord, votre tableau de données semble à l'envers, j'ai donc utilisé array_reverse() pour le réparer. L'hypothèse ici est qu'il existe un ordre logique.

    Comme je devrai peut-être ajouter plusieurs périodes, j'utilise un tableau appelé $durations pour les additionner.

    Ensuite, dans la boucle interne, s'il existe un ancien identifiant d'étape, je peux calculer la durée et l'additionner. Enfin, je me souviens de l'ancienne étape car j'en ai besoin lors de la prochaine itération de la boucle.

    J'ai également renommé beaucoup de choses pour que leurs noms traduisent le contenu des variables.

    répondre
    0
  • Annulerrépondre