在不生成PHP通知的情况下访问未知数组元素的最佳方法是什么?

如果我有这个数组,

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通知如果它不存在?

解决方法:

我从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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...