【PHP8.x】array_slice()関数の使い方
array_slice関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
array_slice関数は、配列の一部を抽出して新しい配列を作成する関数です。具体的には、指定されたオフセットと長さに基づいて、元の配列から要素を切り出します。元の配列は変更されません。
この関数は、配列の中から特定の部分だけを取り出して処理したい場合に非常に役立ちます。たとえば、配列の最初の5つの要素だけを処理したい場合や、特定の範囲の要素を別の関数に渡したい場合などに使用できます。
array_slice関数は、3つの引数を取ります。最初の引数は、操作対象となる配列です。2番目の引数は、切り出しを開始するオフセット(開始位置)です。オフセットは0から始まる整数で、配列の最初の要素を0として数えます。3番目の引数は、切り出す要素の長さ(個数)です。この引数は省略可能で、省略した場合はオフセットから配列の最後までが切り出されます。
さらに、array_slice関数には、4番目のオプションの引数として、キーを保持するかどうかを指定できます。デフォルトでは、数値キーは0から始まる連番にリセットされますが、この引数をtrueに設定すると、元の配列のキーが保持されます。文字列キーは常に保持されます。
array_slice関数は、配列の操作において基本的な機能であり、データ処理やアルゴリズムの実装など、さまざまな場面で活用できます。配列の一部を効率的に取り出すことで、コードの可読性と保守性を向上させることが可能です。
構文(syntax)
1array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array
引数(parameters)
array $array, int $offset, ?int $length = null, bool $preserve_keys = false
- array $array: 対象となる配列
- int $offset: 切り出しを開始する位置(インデックス)
- ?int $length = null: 切り出す要素数。省略時は終端まで。
- bool $preserve_keys = false: キーを保持するかどうか
戻り値(return)
array
指定された配列の一部を切り出した新しい配列を返します。
サンプルコード
PHP array_sliceで連想配列をスライスする
1<?php 2 3/** 4 * array_slice 関数を使って連想配列の一部を抽出する例を示します。 5 * キーの保持/破棄による結果の違いがわかります。 6 */ 7function demonstrateArraySliceAssociative(): void 8{ 9 // サンプルとなる連想配列 10 $associativeArray = [ 11 'apple' => 10, 12 'banana' => 20, 13 'cherry' => 30, 14 'date' => 40, 15 'elderberry' => 50, 16 ]; 17 18 echo "元の連想配列:\n"; 19 print_r($associativeArray); 20 21 // 1. preserve_keys が false の場合 (デフォルト) 22 // 新しい配列では数値インデックスが再構築されます。 23 // 'banana'から2要素を抽出します。 24 $sliceWithoutPreservingKeys = array_slice($associativeArray, 1, 2, false); 25 echo "\n--- preserve_keys = false (デフォルト) の場合 ---\n"; 26 echo "オフセット1から2要素を抽出 (キーを破棄):\n"; 27 print_r($sliceWithoutPreservingKeys); 28 29 // 2. preserve_keys が true の場合 30 // 元のキーが保持されます。 31 // 'cherry'から最後までを抽出します。 32 $sliceWithPreservingKeys = array_slice($associativeArray, 2, null, true); 33 echo "\n--- preserve_keys = true の場合 ---\n"; 34 echo "オフセット2から最後までを抽出 (キーを保持):\n"; 35 print_r($sliceWithPreservingKeys); 36 37 // 3. オフセットが負の数の場合 (末尾からのオフセット) 38 // 最後の2要素を抽出し、キーは保持します。 39 $sliceFromEnd = array_slice($associativeArray, -2, null, true); 40 echo "\n--- オフセットが負の数の場合 ---\n"; 41 echo "末尾から2要素を抽出 (キーを保持):\n"; 42 print_r($sliceFromEnd); 43} 44 45// 関数を実行して結果を表示 46demonstrateArraySliceAssociative(); 47
PHPのarray_slice関数は、配列の中から指定した範囲の要素を新しい配列として抽出する際に使用します。この関数は、引数として元の配列 $array、抽出開始位置を示す $offset、抽出する要素数 $length、そしてキーを保持するかどうかを指定する $preserve_keys を受け取ります。
$offset は、抽出を開始する要素の位置を数値で指定します。例えば、1は2番目の要素から開始し、-2は末尾から2番目の要素から開始します。$length は抽出する要素数で、nullを指定すると$offsetから配列の最後までを抽出します。
特に連想配列を扱う場合、$preserve_keys 引数が重要です。この引数を false (デフォルト) にすると、抽出された要素は新しい数値インデックスに再割り当てされます。一方、true に設定すると、元の配列のキーがそのまま保持されます。
サンプルコードでは、まずデフォルトの false の場合、元の 'banana' 'cherry' が '[0] => 20' '[1] => 30' のように数値キーに変わります。次に true の場合、'cherry' 'date' 'elderberry' の元のキーが保持されたまま抽出されます。最後に、負のオフセットとキー保持を組み合わせ、末尾から2要素 'date' 'elderberry' をキーごと抽出しています。この関数は常に新しい配列を返します。
array_slice関数は、元の配列を変更せずに、指定された範囲の要素を含む新しい配列を返します。特に連想配列に対して使用する際、第四引数preserve_keysの扱いに注意が必要です。この引数がfalse(デフォルト)の場合、抽出された要素のキーは0から始まる数値インデックスに再採番されますので、元のキーを保持したい場合は必ずtrueを指定してください。また、第二引数offsetに負の数を指定すると、配列の先頭からではなく、配列の末尾から数えた位置を始点として要素が抽出されます。これらの引数の挙動を正しく理解し、目的に合わせて適切に設定することが、意図通りの配列操作を行う上で非常に重要です。
PHPで配列の最後のN要素を取得する
1<?php 2 3/** 4 * 配列の最後のN個の要素を抽出します。 5 * 6 * array_slice関数は、オフセットに負の値を指定することで、 7 * 配列の末尾から数えてスライスを開始できます。 8 * 9 * @param array $array 処理対象の配列。 10 * @param int $n 抽出する最後の要素数。 11 * @return array 抽出された要素を含む新しい配列。 12 */ 13function getLastNElements(array $array, int $n): array 14{ 15 // array_sliceの第2引数(オフセット)に負の値を指定することで、 16 // 配列の末尾から数えてスライスを開始します。 17 // 例: -1 は最後の要素、-3 は最後から3番目の要素から開始。 18 // 第3引数(長さ)を省略すると、オフセットから配列の最後までが抽出されます。 19 // 第4引数(preserve_keys)はデフォルトでfalseであり、 20 // 新しい配列では数値キーが0から再インデックスされます。 21 return array_slice($array, -$n); 22} 23 24// --- サンプルコードの実行例 --- 25 26// サンプル配列を定義 27$fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']; 28echo "元の配列: " . implode(', ', $fruits) . "\n"; 29 30// 最後の3要素を抽出して表示 31$lastThreeFruits = getLastNElements($fruits, 3); 32echo "最後の3要素: " . implode(', ', $lastThreeFruits) . "\n"; // 出力例: date, elderberry, fig 33 34// 最後の1要素を抽出して表示 35$lastOneFruit = getLastNElements($fruits, 1); 36echo "最後の1要素: " . implode(', ', $lastOneFruit) . "\n"; // 出力例: fig 37 38// 抽出する要素数 'n' が配列のサイズよりも大きい場合の例 39// array_sliceは可能な限り要素を返します。 40// 負のオフセットが配列の先頭よりも前を指す場合、配列のすべての要素が返されます。 41$moreThanArraySize = getLastNElements($fruits, 10); 42echo "配列サイズを超える要素数 (10) を抽出: " . implode(', ', $moreThanArraySize) . "\n"; // 出力例: apple, banana, cherry, date, elderberry, fig 43 44// 空の配列から要素を抽出する場合 45$emptyArray = []; 46$emptyResult = getLastNElements($emptyArray, 3); 47echo "空の配列から3要素を抽出: " . implode(', ', $emptyResult) . "\n"; // 出力例: (何も表示されない) 48 49?>
PHPのarray_slice関数は、配列から指定した範囲の要素を新しい配列として抽出する機能を提供します。この関数は、特に配列の特定の部分を取り出したい場合に非常に役立ちます。
この関数は、第1引数に処理対象の$array、第2引数に抽出を開始する$offset(オフセット)を受け取ります。オフセットに正の値を指定すると配列の先頭から数え、負の値を指定すると配列の末尾から数え始めます。これにより、サンプルコードのように配列の「最後のN個の要素」を抽出したい場合は、オフセットに-Nのように負の値を指定することで簡単に実現できます。
第3引数には抽出する要素の$length(長さ)を指定できますが、これを省略するとオフセットから配列の最後までが抽出されます。第4引数$preserve_keysはキーを保持するかどうかを決定し、デフォルトのfalseでは数値キーが0から再インデックスされます。戻り値は常に抽出された要素を含む新しい配列です。抽出する要素数が元の配列のサイズよりも大きい場合でも、array_sliceは可能な限り要素を返し、空の配列から抽出を試みると結果も空の配列となります。この関数を理解することで、配列の柔軟な部分抽出が可能になります。
このサンプルコードは、array_slice関数の第2引数(オフセット)に負の値を指定することで、配列の末尾から数えて要素を抽出する点がポイントです。
注意点として、抽出する要素数$nが配列のサイズよりも大きい場合でもエラーにはならず、配列のすべての要素が返されます。また、空の配列を渡した場合もエラーにならず、空の配列が返されるため、処理が予期せず停止することはありません。
補足として、array_slice関数は元の配列を変更せず、常に新しい配列を生成して返します。このサンプルコードではarray_sliceの第4引数(preserve_keys)が省略されており、デフォルト値のfalseが適用されるため、抽出された新しい配列の数値キーは0から振り直されます。元のキーを保持したい場合は、明示的にtrueを設定する必要があります。
PHP array_slice と array_splice の違いを比較する
1<?php 2 3/** 4 * array_slice と array_splice の違いを比較するサンプルコード。 5 * 6 * array_slice は元の配列を変更せず、指定された範囲の要素を新しい配列として返す。 7 * array_splice は元の配列を変更し、指定された範囲の要素を削除または置換し、削除された要素を返す。 8 */ 9function compareArraySliceAndSplice(): void 10{ 11 // array_slice の例: 元の配列は変更されません。 12 echo "--- array_slice の使用例 ---" . PHP_EOL; 13 $originalArrayForSlice = ['apple', 'banana', 'cherry', 'date', 'elderberry']; 14 echo "元の配列: " . implode(', ', $originalArrayForSlice) . PHP_EOL; 15 16 // インデックス1から始まる3つの要素を抽出('banana', 'cherry', 'date') 17 $slicedArray = array_slice($originalArrayForSlice, 1, 3); 18 19 echo "array_slice の結果(抽出された要素): " . implode(', ', $slicedArray) . PHP_EOL; 20 echo "array_slice 適用後の元の配列: " . implode(', ', $originalArrayForSlice) . PHP_EOL; // 元の配列は変更されない 21 echo PHP_EOL; 22 23 // array_splice の例: 元の配列が変更されます。 24 echo "--- array_splice の使用例 (削除) ---" . PHP_EOL; 25 $originalArrayForSpliceDelete = ['apple', 'banana', 'cherry', 'date', 'elderberry']; 26 echo "元の配列: " . implode(', ', $originalArrayForSpliceDelete) . PHP_EOL; 27 28 // インデックス1から始まる3つの要素を削除('banana', 'cherry', 'date') 29 // 削除された要素が $removedElements に格納される 30 $removedElements = array_splice($originalArrayForSpliceDelete, 1, 3); 31 32 echo "array_splice によって削除された要素: " . implode(', ', $removedElements) . PHP_EOL; 33 echo "array_splice 適用後の元の配列: " . implode(', ', $originalArrayForSpliceDelete) . PHP_EOL; // 元の配列は変更される (['apple', 'elderberry'] になる) 34 echo PHP_EOL; 35 36 // array_splice の例: 元の配列の一部を置換します。 37 echo "--- array_splice の使用例 (置換) ---" . PHP_EOL; 38 $originalArrayForSpliceReplace = ['red', 'green', 'blue', 'yellow', 'purple']; 39 echo "元の配列: " . implode(', ', $originalArrayForSpliceReplace) . PHP_EOL; 40 41 // インデックス1から2つの要素 ('green', 'blue') を ['cyan', 'magenta'] で置換 42 $replacedElements = array_splice($originalArrayForSpliceReplace, 1, 2, ['cyan', 'magenta']); 43 44 echo "array_splice によって削除された(置換された)要素: " . implode(', ', $replacedElements) . PHP_EOL; 45 echo "array_splice 適用後の元の配列 (置換後): " . implode(', ', $originalArrayForSpliceReplace) . PHP_EOL; // 元の配列が変更される (['red', 'cyan', 'magenta', 'yellow', 'purple'] になる) 46 echo PHP_EOL; 47} 48 49// 関数を実行 50compareArraySliceAndSplice();
PHPのarray_slice関数は、指定された配列から特定の範囲の要素を抽出し、新しい配列として返す機能を提供します。この関数は、最初の引数$arrayで操作対象の配列を指定し、次の$offset引数で抽出を開始する位置(インデックス)を指定します。$length引数で抽出する要素の数を指定できますが、これを省略すると$offsetから配列の最後までが抽出されます。また、$preserve_keys引数にtrueを渡すと、元の配列のキーを保持したまま要素が抽出されますが、デフォルトでは新しい数値キーが再割り当てされます。
array_sliceの最も重要な点は、この関数が元の配列を一切変更しないことです。これは、配列の一部を切り取って別の処理に利用したいが、元のデータを保持したい場合に非常に役立ちます。対照的に、array_splice関数は、元の配列から要素を削除したり、新しい要素で置き換えたりするなど、元の配列自体を変更する関数です。array_spliceは削除または置換された要素を新しい配列として返します。
したがって、元の配列に影響を与えずに一部を抜き出したい場合はarray_sliceを、元の配列の内容を直接変更したい場合はarray_spliceを使用するなど、目的に応じて使い分ける必要があります。array_sliceの戻り値は、抽出された要素のみを含む新しい配列です。
array_sliceは元の配列を変更せず、指定された範囲の要素を新しい配列として返す非破壊的な操作です。そのため、元のデータを保持しつつ一部を抽出したい場合に安全に利用できます。
一方、array_spliceは元の配列自体を変更します。要素の削除、置換、または追加を行う破壊的な操作です。意図せず元の配列が書き換わってしまうと予期せぬ不具合の原因となるため、この「元の配列への影響」が両関数の最も重要な違いであることを常に意識してください。
戻り値も異なり、array_sliceは抽出された要素を返し、array_spliceは削除(または置換)された要素を返します。目的と副作用を理解し、正しく使い分けることが重要です。
PHP array_slice 連想配列を抽出する
1<?php 2 3/** 4 * array_slice関数の連想配列での使用例を示します。 5 * 連想配列のキーがどのように扱われるかに焦点を当てています。 6 */ 7function demonstrateArraySliceWithAssociativeArray(): void 8{ 9 // サンプルとなる連想配列を定義します。 10 $associativeArray = [ 11 'apple' => 100, 12 'banana' => 150, 13 'cherry' => 200, 14 'date' => 250, 15 'elder' => 300, 16 ]; 17 18 echo "元の連想配列:\n"; 19 print_r($associativeArray); 20 21 echo "\n--- 例1: offset 1 から 3つの要素を抽出 (preserve_keys = false) ---\n"; 22 // デフォルトでは preserve_keys は false です。 23 // 連想配列の文字列キーは、この設定に関わらず常に保持されます。 24 // preserve_keys は、元の配列が数値キーの配列である場合にのみ、キーが0から再インデックスされるかどうかに影響します。 25 $slice1 = array_slice($associativeArray, 1, 3); 26 echo "抽出された配列:\n"; 27 print_r($slice1); 28 29 echo "\n--- 例2: offset 1 から 3つの要素を抽出 (preserve_keys = true) ---\n"; 30 // preserve_keys を true に設定すると、元のキーがそのまま保持されます。 31 // 連想配列の文字列キーは元々保持されるため、この例では例1と同じ結果になります。 32 $slice2 = array_slice($associativeArray, 1, 3, true); 33 echo "抽出された配列:\n"; 34 print_r($slice2); 35 36 echo "\n--- 例3: offset -2 から最後まで抽出 (preserve_keys = true) ---\n"; 37 // offset に負の数を指定すると、配列の末尾からの位置を示します。 38 // -2 は末尾から2番目の要素 ('date') から抽出を開始します。 39 // length に null を指定すると、offset から配列の最後までが抽出されます。 40 $slice3 = array_slice($associativeArray, -2, null, true); 41 echo "抽出された配列:\n"; 42 print_r($slice3); 43 44 echo "\n--- 例4: offset 0 から 2つの要素を抽出 (preserve_keys = false) ---\n"; 45 // 配列の先頭から2つの要素を抽出します。 46 $slice4 = array_slice($associativeArray, 0, 2); 47 echo "抽出された配列:\n"; 48 print_r($slice4); 49} 50 51// array_sliceの動作を確認するために関数を実行します。 52demonstrateArraySliceWithAssociativeArray();
PHPのarray_slice関数は、配列の一部を切り出して新しい配列として返すために使用されます。元の配列は変更されずに、新しい配列が戻り値として得られます。この関数は4つの引数を取ります。最初の$arrayは操作対象の配列、次の$offsetは切り出しを開始する位置で、正の値は先頭から、負の値は末尾からの位置を示します。$lengthは切り出す要素の数で、nullを指定すると$offsetから配列の最後までが抽出されます。最後の$preserve_keysは、キーを保持するかどうかを決定する真偽値です。
特に連想配列を扱う場合、$preserve_keysの挙動には注意が必要です。連想配列(文字列キーを持つ配列)では、$preserve_keysがtrueでもfalseでも、文字列キーは常に保持されます。$preserve_keysが影響するのは、元の配列が数値キーを持つ場合に、そのキーが新しい配列で0から再インデックスされるか、元のキーが保持されるかという点です。
サンプルコードでは、連想配列からarray_sliceを使って要素を抽出する様々な例が示されています。例えば、$offsetを1、$lengthを3として要素を切り出すと、指定された範囲の要素が新しい配列として抽出されます。この際、$preserve_keysをtrueにしてもfalseにしても、連想配列の文字列キーはそのまま保持されることが確認できます。また、$offsetに負の値を指定することで、配列の末尾から数えて要素を抽出することも可能です。この関数は、抽出された要素を含む新しい配列を返します。
array_slice関数を連想配列に使う際、第4引数preserve_keysの挙動は特に重要です。連想配列の文字列キーは、preserve_keysがtrueでもfalseでも常に保持されます。この引数は、元の配列が数値キーの配列である場合に、キーが0から再インデックスされるか否かを制御するためのものです。したがって、連想配列を扱う場合は、preserve_keysの値によってキーの扱いが変わることはありませんのでご注意ください。また、offsetに負の数を指定すると配列の末尾からの位置を示すため、抽出開始位置を誤解しないよう注意が必要です。lengthをnullにすると、offsetから配列の最後までが抽出されます。これらの点を理解し、安全にコードを利用してください。