スタッフダイアリー

便利な関数[isset()つかってnoticeを0目指しましょう編]


便利な関数

こんにちはー。システム課の島田です。
CakePHPで開発するときにデータのやり取りで配列かバリューオブジェクトを扱
うことが多々あります。
配列を扱うとき指定したキーが無いと「Notice: Undefined index」でますよね。
あまりコード的によろしくないので、isset()で調べたりすると思います。

無難にコード書くとしたらこんな感じですね。


$value = null;
if(isset($data[$key])){
  $value = $data[$key];
}


三項演算

$value = isset($data[$key])?$data[$key]:null;



これって項目がいくつもあるとDRYじゃないですよね。
なので僕は自前で関数を使用してます。

ざっくり要件としては
・指定したキーがあったらその値を返す
・多段階配列
です。

Code:

function getArrayValue($data,$path,$defaultReturn = null){
  if(!is_array($data) and !is_object($data)){
    return $defaultReturn;
  }

  if(is_string($path)){
    $path = explode('.',$path);
  }

  foreach($path as $key=>$value){
    if(is_array($data)){
      if(isset($data[$value])){
        $data = $data[$value];

        if($key === count($path) - 1){
          return $data;
        }
      }
    }elseif(is_object($data)){
      if(isset($data->{$value})){
        $data = $data->{$value};

        if($key === count($path) - 1){
          return $data;
        }
      }
    }
  }
  return $defaultReturn;
}


使い方:
階層を「.」で区切ってpathに渡す。です。

$data = array(
  '1'=>array(
    'A'=>'1-A',
    'B'=>'1-B'
  ),
  'hoge'=>array(
    'fuga'=>'hoge-fuga'
  )
);

var_dump(getArrayValue($data,'1.A'));
→string(3) "1-A"

var_dump(getArrayValue($data,'3'));
→NULL

var_dump(getArrayValue($data,'1.C',false));
→bool(false)


※キー自体に「.」が含まれると想定しない動作になるので注意が必要です。

noticeは0を目指しましょうー。