現在の位置: ホーム> 最新記事一覧> 配列の繰り返しトラバーサルを避けてください:array_columnのキャッシュ戦略

配列の繰り返しトラバーサルを避けてください:array_columnのキャッシュ戦略

M66 2025-05-11

PHPでは、 Array_Column関数を使用して、多次元配列から列からデータを抽出するためによく使用されます。ただし、場合によっては、 Array_Columnを使用すると、特に大きな配列で頻繁に操作が必要な場合にパフォーマンスの問題を引き起こす可能性があります。この問題の鍵は、 array_columnが元の配列を複数回通過することです。結果をキャッシュしないと、繰り返しのトラバーサルと不必要なパフォーマンス消費につながる可能性があります。この記事では、キャッシュポリシーを介してArray_Columnを使用してパフォーマンスを向上させるときに、アレイの繰り返しのトラバーサルを回避する方法について説明します。

問題の根:繰り返されるトラバーサル

次のサンプルコードを検討してください。

 $array = [
    ['id' => 1, 'name' => 'Alice', 'age' => 25],
    ['id' => 2, 'name' => 'Bob', 'age' => 30],
    ['id' => 3, 'name' => 'Charlie', 'age' => 35]
];

$names = array_column($array, 'name');

この例では、 array_columnは$ array配列を1回繰り返し、各サブアレイの名前列を抽出します。この操作自体は特に高価ではありませんが、異なる列を複数回抽出する必要がある場合、または大規模な配列でray_columnを繰り返し使用する必要がある場合、パフォーマンスに影響を与える不必要な繰り返しトラバーサルを引き起こします。

解決策:キャッシュを使用して、繰り返しのトラバーサルを避けます

アレイの繰り返しトラバーサルを避けるために、列が初めて抽出されたときに結果をキャッシュに保存できます。次回同じ列が必要なときは、 array_columnを呼び出すことなく、キャッシュから直接読み取られます。

単純なキャッシュ配列を使用します

キャッシュする最も簡単な方法は、配列を使用して既に抽出された列を保存することです。例えば:

 // キャッシュ配リストを初期化します
$cache = [];

function getColumnFromCache($array, $column, &$cache) {
    // リストがすでにキャッシュにあるかどうかを確認してください
    if (!isset($cache[$column])) {
        // リストがキャッシュにない場合,使用 array_column データを取得します,結果をキャッシュします
        $cache[$column] = array_column($array, $column);
    }
    return $cache[$column];
}

$array = [
    ['id' => 1, 'name' => 'Alice', 'age' => 25],
    ['id' => 2, 'name' => 'Bob', 'age' => 30],
    ['id' => 3, 'name' => 'Charlie', 'age' => 35]
];

// キャッシュから取得します 'name' リスト
$names = getColumnFromCache($array, 'name', $cache);
print_r($names);

// 再次キャッシュから取得します 'name' リスト,繰り返されるトラバーサルは避けてください
$namesAgain = getColumnFromCache($array, 'name', $cache);
print_r($namesAgain);

この例では、 GetColumnFromCache関数は、特定の列のデータが$キャッシュアレイに保存されているかどうかを最初に確認します。データがキャッシュされている場合、キャッシュ結果は直接返されます。それ以外の場合、 array_columnが呼び出され、列データを取得してキャッシュに保存します。

より複雑なキャッシュスキーム(RedisやMemcachedなど)を使用します

アプリケーションが大きく、複数のリクエストから同じデータ列を頻繁に抽出する必要がある場合は、RedisやMemcachedなどのより効率的なキャッシュスキームの使用を検討してください。

たとえば、Redisを使用して列データをキャッシュするコードは次のようになります。

 $redis = new Redis();
$redis->connect('127.0.0.1', 6379);

function getColumnFromRedis($array, $column, $redis) {
    // 診る Redis 中是否已缓存该リスト
    $cachedColumn = $redis->get($column);
    if ($cachedColumn === false) {
        // もし Redis 中没有缓存该リスト,使用 array_column データを取得します
        $cachedColumn = json_encode(array_column($array, $column));
        // 結果を保存します Redis
        $redis->set($column, $cachedColumn);
    }
    return json_decode($cachedColumn, true);
}

// サンプルデータ
$array = [
    ['id' => 1, 'name' => 'Alice', 'age' => 25],
    ['id' => 2, 'name' => 'Bob', 'age' => 30],
    ['id' => 3, 'name' => 'Charlie', 'age' => 35]
];

// 得る 'name' リスト
$names = getColumnFromRedis($array, 'name', $redis);
print_r($names);

Redisを介したキャッシュされた列データのこの方法は、特に頻繁なアクセスシナリオの場合、同じデータの繰り返し操作を大幅に削減できます。

結論は

キャッシングポリシーを使用することにより、 Array_Columnを使用する場合の同じデータの複数のトラバーサルを効果的に回避し、それによりパフォーマンスを改善できます。小さなアプリケーションの場合、単純なメモリキャッシュ(配列など)を使用するだけで十分です。大規模なアプリケーションの場合、RedisやMemcachedなどのキャッシュシステムを使用して、パフォーマンスとスケーラビリティをさらに向上させることができます。適切なキャッシュスキームを選択すると、特に大量のデータを処理する場合、プログラムの効率を大幅に最適化できます。