3

この配列があれば、

ini_set('display_errors', true);
error_reporting(E_ALL);

$arr = array(
  'id' => 1234,
  'name' => 'Jack',
  'email' => 'jack@example.com',
  'city' => array(
    'id' => 55,
    'name' => 'Los Angeles',
    'country' => array(
      'id' => 77,
      'name' => 'USA',
     ),
  ),
);

国名を取得できます

$name = $arr['city']['country']['name'];

しかし、country 配列が存在しない場合、PHP は警告を生成します。

Notice: Undefined index ... on line xxx

確かに私は最初にテストを行うことができます:

if (isset($arr['city']['country']['name'])) {
  $name = $arr['city']['country']['name'];
} else {
  $name = '';  // or set to default value;
}

しかし、それは非効率的です。$arr['city']['country']['name'] 存在しない場合、PHP通知を生成せずに取得する最良の方法は何ですか?

4

2 に答える 2

5

以下のコードは Kohana からお借りしました。キーが存在しない場合は、多次元配列の要素または NULL (または選択されたデフォルト値) を返します。

function _arr($arr, $path, $default = NULL) 
{
  if (!is_array($arr))
    return $default;

  $cursor = $arr;
  $keys = explode('.', $path);

  foreach ($keys as $key) {
    if (isset($cursor[$key])) {
      $cursor = $cursor[$key];
    } else {
      return $default;
    }
  }

  return $cursor;
}

上記の入力配列が与えられた場合、その要素に次のようにアクセスします。

echo _arr($arr, 'id');                    // 1234
echo _arr($arr, 'city.country.name');     // USA
echo _arr($arr, 'city.name');             // Los Angeles
echo _arr($arr, 'city.zip', 'not set');   // not set
于 2012-05-28T08:26:31.657 に答える
3

@ エラー制御演算子は、無効な配列キーなど、式によって生成されたエラーを抑制します。

$name = @$arr['city']['country']['name'];
于 2012-05-28T09:12:17.927 に答える