【PHP】ある配列と同じキーを持ち、全ての要素が null である配列を作る方法

  • 2024年8月8日
  • PHP

 しばしば PHP で null 埋めされた連想配列を作りたい時があります。これは配列の未定義インデックス参照を避けつつ配列型の値を使いたい時に作る時が多いです。これを作る方法を紹介します。

 まず一次元配列を元に同型のnull埋め配列をパッっと作る方法です。PHPには`array_fill_keysという関数 が用意されています。この関数を使用することでワンライナーで目的の配列を簡単に作成することができます。具体的には次のように作れます。

$originalArray = [
    'name' => 'John',
    'age' => 30,
    'email' => 'john@example.com'
];
$nullArray = array_fill_keys(array_keys($originalArray), null);
echo json_encode($nullArray, JSON_PRETTY_PRINT) . PHP_EOL;
/*
{
    "name": null,
    "age": null,
    "email": null
}
*/

PHP: array_fill_keys – Manual

 array_fill_keys はキーを指定して配列を任意の値で埋める関数です。これと配列からキーを取得する array_ keysを組み合わせることで $originalArray と同じキーを持ちながらも null 埋めされた値である $nullArray を読みやすいワンライナーで作れます。

 次いで配列が多次元配列の場合にも対応する方法についてです。こちらの場合、配列を再帰的に探索して変更するための関数である array_walk_recursive が PHP に用意されているのでそれを用意します。実際のコードは次です。

<?php
$originalArray = [
    'user' => [
        'name' => 'John',
        'age' => 30,
        'contact' => [
            'email' => 'john@example.com',
            'phone' => '123-456-7890'
        ]
    ],
    'status' => 'active'
];

// array_walk_recursive は配列を破壊的に変更するので、元の配列を保持するためにコピーを作成します
$nullArray = $originalArray;
// 配列の全ての値を null に変更します。&を使って参照渡しにしているので、元の配列が変更されます
array_walk_recursive($nullArray, function(&$v) { $v = null; });

echo json_encode($nullArray, JSON_PRETTY_PRINT) . PHP_EOL;
/*
{
    "user": {
        "name": null,
        "age": null,
        "contact": {
            "email": null,
            "phone": null
        }
    },
    "status": null
}
*/

PHP: array_walk_recursive – Manual

 array_walk_recursive は配列を再帰的に探索して任意の操作を行うための関数です。例のコードではすべての値を null にする関数を用意して適用しています。

 ちなみにarray_fill_keys(array_keys($originalArray), null);の方が$nullArray = $originalArray; array_walk_recursive($nullArray, function(&$v) { $v = null; });より断然高速です。もし高速処理が求められる環境(バッチ処理などで大量のデータを扱う必要があるなど)かつ対象の配列が一次元配列なのであれば前者の方を使った方がいいです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG