我有以下功能:
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()
在1个请求中被多次调用$arr
总是很大$arr
在不同的函数调用(低基数)中可能会有所不同$idx
在每个函数调用(高基数)现在我需要知道,如果$arr
已经缓存,如果没有,那么创建这个“缓存版本”,但也保留所有以前的数组。
根据2.
,我无法使用md5(serialize($arr))
将其用作标识符,因此我需要另一种方法来确定它。您是否知道如何实现这种高性能缓存功能(假设我无法在此功能之外进行任何更改)?
答案 0 :(得分:1)
如果不必修改$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];
}