需要幫助/澄清來自 PHP 方法的快取結果,該方法 接受一個字串并回傳字串中唯一字符的數量(下面的方法??完成并且有效)
function uniqueCharacters($str): int
{
$counter = [];
$splitted = str_split($str);
foreach($splitted as $s) {
if(!isset($counter[$s]))
$counter[$s] = 0;
$counter[$s] ;
}
$unique = array_keys(array_filter($counter, function($c) {
return $c == 1;
}));
return count($unique);
}
預計具有相同字符序列的字串可能會多次傳遞給該方法。由于計數操作可能很耗時,因此該方法應該快取結果,這樣當給該方法一個先前遇到的字串時,它會簡單地檢索存盤的結果。在適當的地方使用集合和地圖。
嘗試了來自https://stackoverflow.com/questions/3540403/caching-function-results-in-php的解決方案,但這不是任務所要求的...
uj5u.com熱心網友回復:
只需在您的函式中保留一個靜態快取,并且僅在第一次遇到該字串時才執行該作業。該static關鍵字將確保變數的內容在后續函式呼叫之間不會丟失。
因為您只有一個字串作為傳入引數,所以您不需要序列化資料以形成字串。在陣列中宣告字串鍵時,這些值不會被破壞。但是,如果您的值(要成為鍵)是浮點數、布林值、null、陣列、物件、資源(可能還有一些我沒有想到的其他型別),那么您最好將其轉換為某種形式字串是安全的。換句話說,如果您的傳入引數是字串或 int 型別(不是 int 和字串的混合),您可以安全地使用我的代碼片段。
代碼:(演示)
function countUniqueCharacters(string $str): int
{
static $cache = [];
if (!key_exists($str, $cache)) {
echo PHP_EOL . "*** doing the work on $str ***";
$cache[$str] = count(
array_filter(
count_chars($str, 1),
fn($count) => $count === 1
)
);
}
return $cache[$str];
}
$tests = ['seven', 'eight', 'nine', 'seven', 'eight'];
foreach ($tests as $test) {
echo PHP_EOL . "$test : " . countUniqueCharacters($test);
}
輸出:
*** doing the work on seven ***
seven : 3
*** doing the work on eight ***
eight : 5
*** doing the work on nine ***
nine : 2
seven : 3
eight : 5
因為您的回傳值是一個 int(不能為 null),所以您可以使用 null 合并運算子來簡化上述操作,如下所示:(Demo)
function countUniqueCharacters(string $str): int
{
static $cache = [];
return $cache[$str] ??= count(
array_filter(
count_chars($str, 1),
fn($count) => $count === 1
)
);
}
相關鏈接:
- 第一次呼叫后通過重寫自身來快取其回應的 PHP 函式
- 如何在laravel中快取函式的結果
- 有沒有更好的方法在 PHP 中快取屬性?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/528277.html
標籤:php数组功能缓存收藏品
