我有以下功能:
function f($idx, $arr) {
static $a;
if ($a == NULL) {
foreach ($arr as $v) {
$key = $v['key'];
if (!isset($a[$key])) {
$a[$key] = array();
}
$a[$key][] = $v;
}
}
return $a[$idx];
}
初始条件为:
- 函数
f()
在一次请求中被多次调用 -
$arr
总是非常大 -
$arr
在不同的函数调用中可能不同(低基数) -
$idx
几乎在每个函数调用中都不同(高基数)
现在我需要知道,如果$arr
已经缓存,如果没有,然后创建这个"缓存版本",但也保留所有以前的数组。
根据2.
,我不能使用md5(serialize($arr))
将其用作标识符,所以我需要另一种方法来确定。您知道如何实现这种高性能缓存功能(假设我无法在此函数之外进行任何更改)吗?
如果不是必须不修改$arr
,那么我就直接将您优化的键访问添加到它:
// note the argument has been changed to &$arr - we're passing by reference
function f($idx, &$arr) {
if (empty($arr['___cached'])) {
$arr['___cached'] = array();
foreach ($arr as $k => $v) {
if ($k === '___cached') continue;
if (!isset($arr['___cached'][$v['key']])) {
$arr['___cached'][$v['key']] = array();
}
$arr['___cached'][$v['key']][] = $v;
}
}
return $arr['___cached'][$idx];
}