開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. 【PHP】入れ子構造データの存在チェックの簡略化
no-image

【PHP】入れ子構造データの存在チェックの簡略化

こんにちは、スズキです。

PHPで開発作業をしていて、知っておくと地味に便利だった小ネタです。

例えば、配列の入れ子構造のデータとして下記のようなデータがあったとします。
        $fieldSettings = [
            'group1' => [
                'field1' => [
                    'displayName' => 'フィールド1',
                ],
                'field2' => [
                    'displayName' => 'フィールド2',
                    'defaultValue' => "デフォルト値です",
                ],
            ],
            'group2' => [
                'field3' => [
                    'displayName' => 'フィールド3',
                ],
            ],
        ];

そして、例えば、設定値を取ってくるメソッドを作成することを考えます。
    private function getFieldSettingValue($fieldSettings, $groupId, $fieldId, $fieldSettingKey)
    {
        // 対象の設定値を返す
        $fieldSettingValue = $fieldSettings[$groupId][$fieldId][$fieldSettingKey];
        return $fieldSettingValue;
    }
上記のようなメソッドの場合、
        // OKパターン
        $fieldSettingValue1 = $this->getFieldSettingValue($fieldSettings, 'group1', 'field1', 'displayName');
という場合はうまくいきますが、
        // NGパターン
        $fieldSettingValue2 = $this->getFieldSettingValue($fieldSettings, 'group3', 'field2', 'displayName');
の場合に、「'group3'なんて知らないよ!!」というエラーが出てしまいます。


仕方が無いので、引数が不正な場合も正常に動作するように以下のような対応が必要になります。
    private function getFieldSettingValue($fieldSettings, $groupId, $fieldId, $fieldSettingKey, $defaultValue = null)
    {
        // 値が取得できない場合はデフォルト値を返す
        if($fieldSettings == null){ return $defaultValue; }
        if(!array_key_exists($groupId, $fieldSettings)){ return $defaultValue; }
        if(!array_key_exists($fieldId, $fieldSettings[$groupId])){ return $defaultValue; }
        if(!array_key_exists($fieldSettingKey, $fieldSettings[$groupId][$fieldId])){ return $defaultValue; }

        // 対象の設定値を返す
        $fieldSettingValue = $fieldSettings[$groupId][$fieldId][$fieldSettingKey];
        return $fieldSettingValue;
    }
中身がだいぶごちゃごちゃしちゃいましたね。

実は、上記のNGパターンを弾くためのチェックですが、issetメソッドを利用して以下のように簡略化して書くことができます。
    private function getFieldSettingValue($fieldSettings, $groupId, $fieldId, $fieldSettingKey, $defaultValue = null)
    {
        // 値が取得できない場合はデフォルト値を返す
        if(!isset($fieldSettings[$groupId][$fieldId][$fieldSettingKey])){
            return $defaultValue;
        }

        // 対象の設定値を返す
        $fieldSettingValue = $fieldSettings[$groupId][$fieldId][$fieldSettingKey];
        return $fieldSettingValue;
    }

という豆知識でした。
  • posted by ナカエ
  • PHP
TOPに戻る