.*): (?.*) \/ (?.*)/m", $progress, $tmp); for($i = 0; $i < count($tmp[0]); $i++) { if(preg_match('/XP\:/', $tmp['task'][$i])) continue; $list[$i] = (object)[ 'task' => trim($tmp['task'][$i]), 'act' => (int)str_replace('.', '', $tmp['act'][$i]), 'max' => (int)str_replace('.', '', $tmp['max'][$i]) ]; $list[$i]->percent = round($list[$i]->act / $list[$i]->max * 100, 2); $list[$i]->left = $list[$i]->max - $list[$i]->act; } usort($list, function($a, $b) { return $b->percent <=> $a->percent; }); $act = $max = $avg = 0; for($i = 0; $i < 5; $i++) { $act += $list[$i]->act; $max += $list[$i]->max; $avg += $list[$i]->percent; } $percent = round($act / $max * 100, 2); $tpl['data'] = [ 'progress' => $progress, 'list' => $list, 'percent' => $percent, 'avg' => round($avg / 5, 2) ]; } else { $tpl['data'] = [ 'progress' => '' ]; }