Каков наилучший способ доступа к неизвестным элементам массива без уведомления PHP?
Если у меня есть этот массив,
ini_set('display_errors', true);
error_reporting(E_ALL);
$arr = array(
'id' => 1234,
'name' => 'Jack',
'email' => '[email protected]',
'city' => array(
'id' => 55,
'name' => 'Los Angeles',
'country' => array(
'id' => 77,
'name' => 'USA',
),
),
);
Я могу получить название страны
$name = $arr['city']['country']['name'];
Но если массив стран не существует, 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 Обратите внимание, если он не существует?
Ответы
Ответ 1
Я одолжил код из Коханы. Он вернет элемент многомерного массива или 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
Ответ 2
Оператор управления ошибкой @
подавляет любые ошибки, сгенерированные выражением, включая недопустимые ключи массива.
$name = @$arr['city']['country']['name'];