【PHP8.x】array_splice関数の使い方

作成日: 更新日:

array_splice関数は、配列の一部分を削除し、必要に応じて他の要素で置き換える関数です。具体的には、指定された配列から、開始位置と長さに基づいて要素を取り除き、取り除いた場所に別の配列の要素を挿入することができます。元の配列は、この操作によって変更されます。

この関数は、配列の特定の部分を効率的に変更する必要がある場合に非常に便利です。例えば、配列から特定の位置にある要素を削除したり、要素を挿入したり、あるいは複数の要素を別の要素の集合で置き換えたりする際に利用できます。

array_splice関数の引数には、操作対象の配列、削除を開始する位置(オフセット)、削除する要素の長さ、そしてオプションとして挿入する要素を含む配列を指定します。オフセットが正の数の場合は配列の先頭からの位置を示し、負の数の場合は配列の末尾からの位置を示します。長さが指定されない場合は、オフセットから配列の末尾までのすべての要素が削除されます。挿入する配列が指定された場合、削除された場所にその配列の要素が挿入されます。

関数は、削除された要素をキーを保持したまま配列として返します。もし要素が削除されなかった場合は、空の配列を返します。元の配列は参照渡しで変更されるため、関数呼び出し後には変更された状態になっています。array_splice関数は、配列の構造を動的に変更する上で強力なツールであり、様々なデータ操作のシナリオで活用できます。

基本的な使い方

構文(syntax)

array_splice(array &$array, int $offset, ?int $length = null, mixed $replacement = []): array

引数(parameters)

array &$array, int $offset, ?int $length = null, mixed $replacement = []

  • array $array: 操作対象の配列。参照渡しのため、関数内で直接変更されます。
  • int $offset: 配列のどの位置から操作を開始するかを指定する整数。
  • ?int $length = null: 削除または置換する要素の数を示す整数。null の場合は、$offset から配列の最後までとなります。
  • mixed $replacement = []: 削除した位置に挿入する要素を指定します。配列でも単一の要素でも指定可能です。

戻り値(return)

array

配列から指定された要素を削除し、代わりに新しい要素を挿入した結果の配列を返します。

サンプルコード

PHP array_splice で連想配列を操作する

<?php

/**
 * array_splice 関数を使って連想配列を操作する例を示します。
 *
 * array_splice 関数は、配列の指定した位置から要素を削除し、
 * 必要に応じて新しい要素を挿入するために使用されます。
 * 連想配列の場合でも、オフセットと長さは数値インデックスとして扱われますが、
 * 既存のキーは維持され、挿入される要素のキーも維持されます。
 */
function demonstrateArraySpliceWithAssociativeArray(): void
{
    // 操作対象となる連想配列を定義します。
    $associativeArray = [
        'apple'      => 100,
        'banana'     => 150,
        'cherry'     => 200,
        'date'       => 250,
        'elderberry' => 300,
    ];

    echo "--- 元の連想配列 ---\n";
    print_r($associativeArray);

    // 例1: 特定の要素を削除する
    // オフセット1(2番目の要素 'banana')から1つの要素を削除します。
    // array_spliceは数値インデックスで処理するため、キーに関わらず位置で指定します。
    echo "\n--- 1. オフセット1から1つの要素を削除 ---\n";
    $removedElements1 = array_splice($associativeArray, 1, 1);
    echo "削除された要素:\n";
    print_r($removedElements1);
    echo "操作後の配列:\n";
    print_r($associativeArray);
    // 結果: 'banana' => 150 が削除され、残りの要素が詰まります。
    // キーは維持されます: ['apple' => 100, 'cherry' => 200, 'date' => 250, 'elderberry' => 300]

    // 例2: 特定の要素を別の連想配列で置換する
    // 現在の配列のオフセット2(3番目の要素 'date')から1つの要素を削除し、
    // 新しい連想配列 ['fig' => 350, 'grape' => 400] を挿入します。
    echo "\n--- 2. オフセット2から1つの要素を別の連想配列で置換 ---\n";
    $replacementArray = ['fig' => 350, 'grape' => 400];
    $removedElements2 = array_splice($associativeArray, 2, 1, $replacementArray);
    echo "削除された要素:\n";
    print_r($removedElements2);
    echo "操作後の配列:\n";
    print_r($associativeArray);
    // 結果: 'date' => 250 が削除され、その位置に 'fig' と 'grape' が挿入されます。
    // ['apple' => 100, 'cherry' => 200, 'fig' => 350, 'grape' => 400, 'elderberry' => 300]

    // 例3: 特定の位置に連想配列を挿入する (削除する要素は0)
    // 現在の配列のオフセット1(2番目の要素 'cherry' の前)に、
    // 新しい連想配列 ['honeydew' => 450] を挿入します。
    // 削除する要素数は 0 なので、既存の要素は削除されずに後ろにずれます。
    echo "\n--- 3. オフセット1に新しい連想配列を挿入 ---\n";
    $insertionArray = ['honeydew' => 450];
    $removedElements3 = array_splice($associativeArray, 1, 0, $insertionArray);
    echo "削除された要素 (挿入のみの場合は空の配列):\n";
    print_r($removedElements3); // この場合は空の配列が返されます
    echo "操作後の配列:\n";
    print_r($associativeArray);
    // 結果: 'apple' と 'cherry' の間に 'honeydew' が挿入されます。
    // ['apple' => 100, 'honeydew' => 450, 'cherry' => 200, 'fig' => 350, 'grape' => 400, 'elderberry' => 300]
}

// 関数を実行して、連想配列に対する array_splice の動作を確認します。
demonstrateArraySpliceWithAssociativeArray();

?>

array_splice関数は、配列の指定した位置から要素を削除し、必要に応じて新しい要素を挿入するために使用されます。第一引数$arrayには操作対象の配列を、第二引数$offsetには操作を開始する位置を整数で指定します。第三引数$lengthで削除する要素数を指定でき、省略すると$offset以降の全ての要素が削除されます。$lengthに0を指定すると、要素を削除せずに挿入のみが行われます。第四引数$replacementには挿入したい要素を配列として指定できます。この関数は、削除された要素を新しい配列として返します。

連想配列に対してarray_spliceを使用する場合、$offset$lengthはキーではなく、配列の先頭から0, 1, 2...と数えられる数値インデックスとして扱われます。例えば、サンプルコードの例1では、元の連想配列のオフセット1、つまり2番目の要素である'banana'が削除されました。削除された要素も連想配列として返されます。例2では、特定の要素を別の連想配列で置換しており、削除された要素が返され、指定位置に新しいキーと値が維持されたまま挿入されています。例3では、$lengthを0とすることで、既存の要素を削除せずに、指定された$offsetに新しい連想配列を挿入する様子が示されています。このように、array_spliceは連想配列のキーを維持しながら、要素の削除、置換、挿入を柔軟に行うことができます。

array_splice関数は連想配列を操作する際、オフセットと長さは数値インデックス(配列内の位置)として扱われる点に注意が必要です。特定のキー名を指定して要素を操作することはできません。この関数は引数に渡された元の配列を直接変更します。新しい配列を生成して返すわけではないため、操作後の配列は元の変数に格納されます。関数の戻り値は、操作によって配列から削除された要素の配列です。もし要素が削除されずに挿入のみが行われた場合は、空の配列が返されます。連想配列の場合、既存のキーは維持されますが、要素の並び順は変更される可能性があります。また、挿入される要素もキーごと追加されます。

array_spliceで連想配列を操作する

<?php

/**
 * array_splice を使って連想配列の要素を操作するサンプルです。
 *
 * array_splice は、連想配列に対しても数値インデックスに基づいて要素の削除、置換、挿入を行います。
 * オフセットと長さは要素の順序に基づきますが、置き換え要素として渡す連想配列のキーは保持されます。
 */

// 元の連想配列
$userData = [
    'id' => 101,
    'name' => 'Alice Smith',
    'email' => 'alice@example.com',
    'age' => 30,
    'status' => 'active',
];

echo "--- 元の連想配列 ---\n";
print_r($userData);

// 1. 'email' と 'age' を削除する (インデックス 2 と 3 の要素)
// array_spliceは元の配列を変更し、削除された要素の配列を返します。
$removedElements = array_splice($userData, 2, 2);

echo "\n--- 'email' と 'age' を削除後 ---\n";
print_r($userData);
echo "削除された要素:\n";
print_r($removedElements); // 出力: ['email' => 'alice@example.com', 'age' => 30]

// 現在の $userData の状態:
// ['id' => 101, 'name' => 'Alice Smith', 'status' => 'active']
// (内部的な数値インデックス: 0 => 'id', 1 => 'name', 2 => 'status')

// 2. 'name' (インデックス1) の後に新しい要素 'firstName' と 'lastName' を挿入する
// オフセット1の位置で0個の要素を削除し、指定の連想配列を挿入します。
array_splice($userData, 1, 0, [
    'firstName' => 'Bob',
    'lastName' => 'Johnson',
]);

echo "\n--- 'firstName' と 'lastName' 挿入後 ---\n";
print_r($userData);

// 現在の $userData の状態:
// ['id' => 101, 'firstName' => 'Bob', 'lastName' => 'Johnson', 'name' => 'Alice Smith', 'status' => 'active']
// (内部的な数値インデックス: 0 => 'id', 1 => 'firstName', 2 => 'lastName', 3 => 'name', 4 => 'status')

// 3. 'status' (インデックス4) を新しい要素で置換する
// オフセット4の位置で1個の要素を削除し、指定の連想配列を挿入します。
array_splice($userData, 4, 1, [
    'isAdmin' => true,
    'lastLogin' => '2023-10-27 10:00:00',
]);

echo "\n--- 'status' を 'isAdmin' と 'lastLogin' で置換後 ---\n";
print_r($userData);

// 最終的な $userData の状態:
// ['id' => 101, 'firstName' => 'Bob', 'lastName' => 'Johnson', 'name' => 'Alice Smith', 'isAdmin' => true, 'lastLogin' => '2023-10-27 10:00:00']

PHPのarray_splice関数は、配列から指定した要素を削除したり、新しい要素で置き換えたり、特定の場所に挿入したりするために使われます。この関数は、第一引数で渡された配列自体を変更する点が特徴で、削除された要素は戻り値として新しい配列で返されます。

array_spliceでは、操作の開始位置を示す$offsetと、削除する要素の数を示す$lengthを数値インデックスで指定します。連想配列の場合も、要素の物理的な並び順を0から始まる数値インデックスとして扱います。もし$lengthに0を指定した場合、要素の削除は行われず、$offsetで指定した位置に第三引数$replacementの要素を挿入できます。

サンプルコードでは、まず$userDataという連想配列から、数値インデックスで2番目と3番目の要素('email''age')を削除しています。次に、'name'の要素の後に'firstName''lastName'という新しい連想配列要素を挿入し、その後'status'要素を'isAdmin''lastLogin'で置き換えています。ここで挿入や置換に連想配列を渡した場合、$replacementで指定した連想配列のキーはそのまま保持されて元の配列に組み込まれます。これにより、連想配列のキー構造を維持しつつ、柔軟な配列操作が可能です。

array_splice関数は連想配列に対しても使用できますが、要素の操作はキーではなく、数値インデックス(要素の出現順序)に基づいて行われる点に特に注意が必要です。offsetlengthは、この数値インデックスを基準に指定してください。

また、この関数は引数で渡された元の配列を直接変更します。削除された要素は戻り値として返されますが、操作後の配列自体が返されるわけではありません。replacementに連想配列を指定した場合、そのキーは保持されたまま挿入・置換されます。これらの特性を理解し、配列の構造や内容が意図せず変更されることを避けるように利用してください。

【PHP8.x】array_splice関数の使い方 | いっしー@Webエンジニア