Вопрос по php – Каков наилучший способ доступа к неизвестным элементам массива без генерации уведомления PHP?

2

Если у меня есть этот массив,

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'] without generating PHP Notice if it doesn't exist?

@deceze: это неэффективно, поскольку получение одного значения занимает 4+ строки. flowfree
Почему это "неэффективно"? deceze♦
Откуда поступают данные? Если вы работаете от третьей стороны, вам следует написать одну функцию синтаксического анализа, чтобы проанализировать ее в стандартизированной структуре данных, о которой вы знаете, какие ключи существуют, а какие нет ... deceze♦

Ваш Ответ

2   ответа
2

@ оператор контроля ошибок подавляет любые ошибки, сгенерированные выражением, включая недопустимые ключи массива.

$name = @$arr['city']['country']['name'];
Если бы вы хотели написать чистый код, то вы бы использовалиisset() как вы объясните в самом вашем вопросе. Но это многословно, поэтому вы ищете альтернативы.@ наименее многословный из них.
На самом деле я хочу написать чистый код, поэтому я избегаю@ ловить любые предупреждения и уведомления и исправлять их. flowfree
4

Я позаимствовал код ниже у Коханы. Он вернет элемент многомерного массива или 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

Похожие вопросы