Maison > Questions et réponses > le corps du texte
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粉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) } }
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.