[ 'time' => microtime(1), 'memory' => 0, 'memory_peak' => 0, ], 'total' => [ 'time' => 0, 'memory' => 0, 'memory_peak' => 0, ], ]; } // Current присваиваем после, а то в time может быть -0 - некрасиво $current = [ 'time' => microtime(1), 'memory' => memory_get_usage(), 'memory_peak' => memory_get_peak_usage(), ]; $diff = []; foreach ($current as $key => $value) { $d = $value - $storage_variable['recent'][$key]; if ($key == 'time') $d = round( ( ($microseconds) ? 1000000 : 1000) * $d); else $d = round($d/1024/1024, 2); // (когда функция будет преобразована в класс, округлять при сборе данных не будем вообще, // а перенесём это в метод, который будет отвечать за вывод и представление данных) $storage_variable['total'][$key] += $d; $diff[$key] = $d; } if ($name) { $e = explode(':', $name, 2); $keystring = $e[0]; // ключ $T = (isset($e[1])) ? $e[1] : ''; // название unset($e); $tmp = &$storage_variable; foreach (explode('.', $keystring) as $K) { $tmp = &$tmp['list']; // Нужно для проверки автоинкремент if ($K == '%+') { // автоинкрементная нумерация $K = ($tmp) ? max(array_keys($tmp)) + 1 : 0; $T = str_replace('%+', $K, $T); // вложенный + не получится; ну и ладно... } $tmp = &$tmp[$K]; if (!$tmp) $tmp = $diff; else foreach ($diff as $key => $value) if ($key == 'title') $tmp[$key] = $value; else $tmp[$key] += $value; } if ($T) // А title, если есть, присваиваем только $tmp['title'] = $T; // последнему уровню вложенности. unset($tmp); } $storage_variable['recent'] = $current; return $storage_variable; } ?>