Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP格式化数字以提高性能?_Php_Arrays_Performance - Fatal编程技术网

如何使用PHP格式化数字以提高性能?

如何使用PHP格式化数字以提高性能?,php,arrays,performance,Php,Arrays,Performance,这个foreach必须在getChartC方法中以每分钟约8000次的速度循环,我还在研究这个方法 我希望了解如何优化它的运行时。我添加了一个用于测试的JSON输入 $arr = '[{"date":"2019-05-01","open":78.49,"high":78.92,"low":77.28,"close":77.47,"volume":1078572,"unadjustedVolume":1078572,"change":-1.03,"changePercent":-1.312,"vw

这个foreach必须在
getChartC
方法中以每分钟约8000次的速度循环,我还在研究这个方法

我希望了解如何优化它的运行时。我添加了一个用于测试的JSON输入

$arr = '[{"date":"2019-05-01","open":78.49,"high":78.92,"low":77.28,"close":77.47,"volume":1078572,"unadjustedVolume":1078572,"change":-1.03,"changePercent":-1.312,"vwap":77.6704,"label":"May 1","changeOverTime":-0.034232572055450224},{"date":"2019-04-30","open":77.44,"high":78.59,"low":77.38,"close":78.5,"volume":1726239,"unadjustedVolume":1726239,"change":1.17,"changePercent":1.513,"vwap":78.211,"label":"Apr 30","changeOverTime":-0.02139224094943645},{"date":"2019-04-29","open":77.47,"high":78.44,"low":77.32,"close":77.33,"volume":2177700,"unadjustedVolume":2177700,"change":-0.09,"changePercent":-0.116,"vwap":77.6235,"label":"Apr 29","changeOverTime":-0.035977859778597736},{"date":"2019-04-26","open":76.98,"high":77.46,"low":76.3,"close":77.42,"volume":1608922,"unadjustedVolume":1608922,"change":0.7,"changePercent":0.912,"vwap":77.0929,"label":"Apr 26","changeOverTime":-0.03485588909943144},{"date":"2019-04-25","open":75.26,"high":77.04,"low":74.94,"close":76.72,"volume":1481436,"unadjustedVolume":1481436,"change":0.93,"changePercent":1.227,"vwap":76.5895,"label":"Apr 25","changeOverTime":-0.043582327715168984},{"date":"2019-04-24","open":75.84,"high":76.63,"low":75.4306,"close":75.79,"volume":1942651,"unadjustedVolume":1942651,"change":0.23,"changePercent":0.304,"vwap":75.993,"label":"Apr 24","changeOverTime":-0.055176024733220155},{"date":"2019-04-23","open":74.28,"high":76.8,"low":73.76,"close":75.56,"volume":4607107,"unadjustedVolume":4607107,"change":-0.01,"changePercent":-0.013,"vwap":75.4099,"label":"Apr 23","changeOverTime":-0.05804328313553396},{"date":"2019-04-22","open":75.93,"high":76.72,"low":75.13,"close":75.57,"volume":2016043,"unadjustedVolume":2016043,"change":-0.6,"changePercent":-0.788,"vwap":75.5973,"label":"Apr 22","changeOverTime":-0.05791861972673782},{"date":"2019-04-18","open":75.73,"high":76.54,"low":75.31,"close":76.17,"volume":2874195,"unadjustedVolume":2874195,"change":0.74,"changePercent":0.981,"vwap":76.0871,"label":"Apr 18","changeOverTime":-0.050438815198962705},{"date":"2019-04-17","open":78.15,"high":78.32,"low":74.46,"close":75.43,"volume":4471971,"unadjustedVolume":4471971,"change":-2.12,"changePercent":-2.734,"vwap":75.5775,"label":"Apr 17","changeOverTime":-0.05966390744988515},{"date":"2019-04-16","open":80.82,"high":80.96,"low":77.19,"close":77.55,"volume":3441597,"unadjustedVolume":3441597,"change":-2.85,"changePercent":-3.545,"vwap":78.238,"label":"Apr 16","changeOverTime":-0.033235264785080244},{"date":"2019-04-15","open":81,"high":81.13,"low":79.905,"close":80.4,"volume":1627268,"unadjustedVolume":1627268,"change":-0.58,"changePercent":-0.716,"vwap":80.3097,"label":"Apr 15","changeOverTime":0.0022938067218511485},{"date":"2019-04-12","open":81.43,"high":82.06,"low":80.9,"close":80.98,"volume":1249295,"unadjustedVolume":1249295,"change":-0.1,"changePercent":-0.123,"vwap":81.275,"label":"Apr 12","changeOverTime":0.009524284432033635},{"date":"2019-04-11","open":81.88,"high":81.92,"low":80.89,"close":81.08,"volume":1071479,"unadjustedVolume":1071479,"change":-0.6,"changePercent":-0.735,"vwap":81.167,"label":"Apr 11","changeOverTime":0.010770918519996066},{"date":"2019-04-10","open":81.45,"high":82.24,"low":81.45,"close":81.68,"volume":982886,"unadjustedVolume":982886,"change":0.26,"changePercent":0.319,"vwap":81.8295,"label":"Apr 10","changeOverTime":0.01825072304777118},{"date":"2019-04-09","open":81.56,"high":81.72,"low":81.27,"close":81.42,"volume":1254742,"unadjustedVolume":1254742,"change":-0.27,"changePercent":-0.331,"vwap":81.4828,"label":"Apr 9","changeOverTime":0.015009474419068613},{"date":"2019-04-08","open":81.57,"high":81.71,"low":80.585,"close":81.69,"volume":783350,"unadjustedVolume":783350,"change":0.22,"changePercent":0.27,"vwap":81.4154,"label":"Apr 8","changeOverTime":0.018375386456567316},{"date":"2019-04-05","open":81.19,"high":81.92,"low":81.05,"close":81.47,"volume":1502875,"unadjustedVolume":1502875,"change":0.64,"changePercent":0.792,"vwap":81.5319,"label":"Apr 5","changeOverTime":0.015632791463049828},{"date":"2019-04-04","open":81.84,"high":82.05,"low":80.44,"close":80.83,"volume":2180112,"unadjustedVolume":2180112,"change":-1.11,"changePercent":-1.355,"vwap":80.9867,"label":"Apr 4","changeOverTime":0.0076543333000898125},{"date":"2019-04-03","open":81.54,"high":82.02,"low":81.46,"close":81.94,"volume":2141025,"unadjustedVolume":2141025,"change":0.8,"changePercent":0.986,"vwap":81.8699,"label":"Apr 3","changeOverTime":0.02149197167647357},{"date":"2019-04-02","open":81.71,"high":81.76,"low":81.03,"close":81.14,"volume":1203037,"unadjustedVolume":1203037,"change":-0.42,"changePercent":-0.515,"vwap":81.3105,"label":"Apr 2","changeOverTime":0.011518898972773594},{"date":"2019-04-01","open":80.96,"high":81.77,"low":80.96,"close":81.56,"volume":1522681,"unadjustedVolume":1522681,"change":1.344,"changePercent":1.675,"vwap":81.4869,"label":"Apr 1","changeOverTime":0.01675476214221612},{"date":"2019-03-29","open":79.9965,"high":80.5054,"low":79.7869,"close":80.216,"volume":1585137,"unadjustedVolume":1585137,"change":0.678613,"changePercent":0.853,"vwap":80.1822,"label":"Mar 29","changeOverTime":0}]';

// input array
$arr = json_decode($arr, true);

// output array
$output_arr = array();
foreach ($arr as $k => $v) {
    $output_arr["c"][$k]["s"] = $arr[$k]["date"]; // session
    $output_arr["c"][$k]["l"] = money_format('%=9.4n', $arr[$k]["low"]); // session low price
    $output_arr["c"][$k]["h"] = money_format('%=9.4n', $arr[$k]["high"]); // session high price
    $output_arr["c"][$k]["c"] = money_format('%=9.4n', $arr[$k]["close"]); // session close price
    $output_arr["c"][$k]["o"] = money_format('%=9.4n', $arr[$k]["open"]); // session open price
    $output_arr["c"][$k]["w"] = money_format('%=9.4n', $arr[$k]["vwap"]); // session equilibrium price
    $output_arr["c"][$k]["d"] = money_format('%=9.4n', $arr[$k]["change"]); // session change dollar
    $output_arr["c"][$k]["v"] = number_format($arr[$k]["volume"]); // session volume
    $output_arr["c"][$k]["p"] = round($arr[$k]["changePercent"], 4) . '%'; // session change %
    $output_arr["c"][$k]["t"] = round($arr[$k]["changeOverTime"], 4) . '%'; // change over time %
}

试着这样做:

$output_arr = array(
"c" => array_map(function (&$json) {
    return array(
        "s" => $json["date"], // session
        "l" => money_format('%=9.4n', $json["low"]), // session low price
        "h" => money_format('%=9.4n', $json["high"]), // session high price
        "c" => money_format('%=9.4n', $json["close"]), // session close price
        "o" => money_format('%=9.4n', $json["open"]), // session open price
        "w" => money_format('%=9.4n', $json["vwap"]), // session equilibrium price
        "d" => money_format('%=9.4n', $json["change"]), // session change dollar
        "v" => number_format($json["volume"]), // session volume
        "p" => round($json["changePercent"], 4) . '%', // session change %
        "t" => round($json["changeOverTime"], 4) . '%' // change over time %
    );
}, $arr));
您好,
Matt

我建议完全放弃该功能。它不跨系统可用,使用浮动可能会失去精度

此外,使用货币区域设置格式化表中的数据会非常慢,并且会有大量数据重复。相反,我建议保持原样,并在表的顶部添加一个元数据部分,告诉用户使用的货币是什么:

{
    "metadata": {
        "currency": "USD",
        "datetime": "2019-05-02T22:42:45+01:00",
        //... so on
    },
    "dataSet": [...]
}
看看他们是如何准备结果集的。它们将金额输出为字符串,不带区域设置。例如:

"2019-05-02": {
    "1. open": "127.9800",
    "2. high": "128.0000",
    "3. low": "125.5200",
    "4. close": "126.2100",
    "5. volume": "25153196"
}

我觉得这个问题在代码审查时会更好。工作代码的优化有点超出范围。顺便说一句,我讨厌这个函数
money\u format()
,因为它不仅处理浮点数形式的钱,而且只在Linux上工作,我无法在本地机器上执行此代码。我发现了这个,但我认为这将是一个兔子洞。我建议完全放弃这种货币。看看另一个伟大的免费API是做什么的,您可能需要找到一种方法来并行运行多个进程,或者获得一台更快的机器。已对foreach与map进行了基准测试。没有太大区别。为什么要使用引用参数?PHP使用写时复制,但由于函数从不修改参数,因此它永远不会复制参数。几乎可以肯定,瓶颈是所有格式,而不是循环。