1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PHPの連想配列でUndefined indexを出さない実装:あなたはどちら派?

Last updated at Posted at 2022-06-13
../

連想配列(個人的にassociation listと呼んだ方が親しみがある)を使って、該当するキーがないときにnullなどを返すようにしたい。例えば、以下のような連想配列$arrからFrenchで検索すると、「PHP Notice: Undefined index: French」のエラーが出る。

$arr = [
  'Japanese' => 'こんにちは',
  'English' => 'Hello'
];

echo $arr['Japanese'].PHP_EOL;
echo $arr['French'].PHP_EOL;

そこでUndefined indexのエラーを出さないように、以下のコードが考えられる。getValue1()getValue2()である。

function getValue1(array &$arr, string $key): string {
  if (isset($arr[$key])){
    return $arr[$key];
  }
  return '';
}

function getValue2(array &$arr, string $key): string {
  foreach ($arr as $k => $v) {
    if ($key == $k){
      return $v;
    }
  }
  return '';
}

echo getValue1($arr, 'Japanese').PHP_EOL;
echo getValue1($arr, 'French').PHP_EOL;
echo getValue2($arr, 'Japanese').PHP_EOL;
echo getValue2($arr, 'French').PHP_EOL;

getValue1()のコードと、getValue2()のコードでは、どちらが効率いいのだろうか。一般に、getValue1()のようなコードをよく見かけるが、内部的には2回ループしているはずだ。
getValue2()の方は、1回のループで実現できているので効率がよさそうに思える。しかし、変数へバインドする負荷があるので微妙だ。どちらがお勧めなのかな。

(追記)Null合体演算子やarray_key_exists()も有効

コメント欄にアドバイスをいただきました。array_key_exists()やNull合体演算子も有効そうです。

連想配列がHashで実装されているなら、getValue2()ようなforeachで回すよりも、getValue1()のようなコードやNull合体演算子の利用の方が効率良さそうです。

../
1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?