Heim > Fragen und Antworten > Hauptteil
Ich habe das folgende Array:
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
Ich habe jedes Unterarray mit entity_id
neu gruppiert:
$result = array(); foreach ($data as $element) { //var_dump($element); $result[$element['entity_id']][] = $element; }
Was mich ausgibt:
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
Jetzt muss ich die Dauer jeder Phase berechnen (Aufzeichnen, Genehmigen, Erfüllen, Akzeptieren, Überprüfen).
Zum Beispiel:
Protokoll: 1671011168777 - 1671011166077 = 2700
Genehmigt:1671027321749 - 1671011168777 = 16152972
Umsetzung:(1671100537178 - 1671100012012) + (1671099802675 - 1671027321749) = 73006092
Akzeptiert:(1671101084788 - 1671100537178) + (1671099984979 - 1671099802675) = 729914
Kommentare: 1671100012012 - 1671099984979 = 27033
Ich konnte jede Phase analysieren mit:
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); } } }
Aber mir ist nicht klar, wie ich die Dauer jeder Phase berechnen soll.
Die erwarteten Ergebnisse sind wie folgt:
array (size=1) 571962 => array (size=8) 'Log' => int 2700 'Approve' => int 16152972 'Fulfill' => int 73006092 'Accept' => int 729914 'Review' => int 27033
PHP Online: https://onlinephp.io/c/2270e
Workflow:
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) } }
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,我可以计算持续时间并将其相加。最后我记得旧的阶段,因为我在循环的下一次迭代中需要它。
我还重命名了很多东西,使其名称能够传达变量的内容。