PHPでは、 Array_Chunk関数は通常、アレイを複数の小さなアレイに分割するために使用されます。ただし、この関数は、デフォルトでは配列のサイズに応じてのみ分割でき、配列内の特定のフィールドに応じて分割することはできません。指定されたフィールドで連想配列を分割し、配列のデータを段階的に処理する場合は、少し変更する必要があります。
この記事では、 Array_Chunk関数を他のいくつかのPHP手法と組み合わせて使用して、指定されたフィールドに従って連想配列を分割し、段階的に処理する方法を紹介します。
Array_chunk関数は、PHPで非常に便利な機能であり、配列を複数のサブアレイに分割し、多次元配列を返すことができます。基本的な構文は次のとおりです。
array_chunk(array $array, int $size, bool $preserve_keys = false): array
$配列:分割する配列。
$サイズ:各サブアレイのサイズ。
$ preserve_keys : Trueに設定されている場合、配列のキー名が保持されます。それ以外の場合は、再インデックスします。
たとえば、次のコードは、2つの要素を含む各サブアレイに数字の単純な配列を分割します。
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$result = array_chunk($numbers, 2);
print_r($result);
出力結果:
Array
(
[0] => Array ( [0] => 1 [1] => 2 )
[1] => Array ( [0] => 3 [1] => 4 )
[2] => Array ( [0] => 5 [1] => 6 )
[3] => Array ( [0] => 7 [1] => 8 )
[4] => Array ( [0] => 9 )
)
連想配列の場合、アレイの特定のフィールドで配列を分割したい場合があります。この時点では、 Array_chunkを使用して配列を分割できますが、他の操作を組み合わせて分割の条件を指定する必要があります。
ユーザーデータを含む関連配列があり、各ユーザーには都市フィールドがあり、これらのユーザーデータを都市フィールドに基づいて複数のサブアレイに分割したいとします。
$users = [
['name' => 'Alice', 'city' => 'New York'],
['name' => 'Bob', 'city' => 'Los Angeles'],
['name' => 'Charlie', 'city' => 'New York'],
['name' => 'David', 'city' => 'Chicago'],
['name' => 'Eve', 'city' => 'Los Angeles'],
['name' => 'Frank', 'city' => 'Chicago']
];
このデータをシティフィールドごとに分割するには、まずユーザーをCityごとにグループ化する必要があります。 array_reduceまたはその他の方法を使用して実装できます。
$groupedByCity = [];
foreach ($users as $user) {
$groupedByCity[$user['city']][] = $user;
}
この時点で、 $ groupedByCityアレイの構造は次のとおりです。
Array
(
[New York] => Array
(
[0] => Array ( [name] => Alice [city] => New York )
[1] => Array ( [name] => Charlie [city] => New York )
)
[Los Angeles] => Array
(
[0] => Array ( [name] => Bob [city] => Los Angeles )
[1] => Array ( [name] => Eve [city] => Los Angeles )
)
[Chicago] => Array
(
[0] => Array ( [name] => David [city] => Chicago )
[1] => Array ( [name] => Frank [city] => Chicago )
)
)
次に、 array_chunk関数を使用して、各都市のユーザーデータを小さなサブアレイに分割できます。たとえば、各都市のユーザーのリストに最大2人のユーザーを含めることが必要です。
$chunkedByCity = [];
foreach ($groupedByCity as $city => $users) {
$chunkedByCity[$city] = array_chunk($users, 2);
}
この時点で、 $ chunkedbycityアレイの構造は次のようになります。
Array
(
[New York] => Array
(
[0] => Array ( [name] => Alice [city] => New York )
[1] => Array ( [name] => Charlie [city] => New York )
)
[Los Angeles] => Array
(
[0] => Array ( [name] => Bob [city] => Los Angeles )
[1] => Array ( [name] => Eve [city] => Los Angeles )
)
[Chicago] => Array
(
[0] => Array ( [name] => David [city] => Chicago )
[1] => Array ( [name] => Frank [city] => Chicago )
)
)
Array_chunkを使用してArrayをフィールドごとに分割すると、これらのサブアレイを段階的に処理できます。たとえば、各都市のデータを通過し、各サブアレイのユーザー情報の出力など、いくつかの操作を実行できます。
foreach ($chunkedByCity as $city => $chunks) {
echo "City: $city\n";
foreach ($chunks as $chunk) {
echo "Users:\n";
foreach ($chunk as $user) {
echo "- {$user['name']}\n";
}
}
}
出力の結果は次のとおりです。
City: New York
Users:
- Alice
- Charlie
City: Los Angeles
Users:
- Bob
- Eve
City: Chicago
Users:
- David
- Frank
URL情報を含む配列があり、URLのドメイン名( M66.NETなど)に従って分割および処理したいとします。簡単な例を次に示します。
Processing URLs:
- http://m66.net/page1
- http://m66.net/page2