Безопасно получить значение элемента массива для определенных и undefined индексов - программирование
Подтвердить что ты не робот

Безопасно получить значение элемента массива для определенных и undefined индексов

Я устаю писать тернарные выражения для дезинфекции данных, например:

$x = isset($array['idx']) ? $array['idx'] : null;
// and
$x = !empty($array['idx']) ? $array['idx'] : null;

Есть ли собственный способ или ZF accessor/filter, чтобы получить значение элемента массива для определенного массива без:

  • отключение error_reporting
  • trernary isset/empty проверить
  • оператор управления ошибкой @
  • создание моей собственной глобальной функции или аппликатора/фильтра приложения

Что-то вроде:

$x = get_if_set($array['idx']);
// or 
$x = Zend_XXX($array, 'idx')
4b9b3361

Ответ 1

Поскольку вам нужно только NULL как "значение по умолчанию", вы можете использовать оператор подавления ошибок:

$x = @$array['idx'];

Критика: Использование оператора подавления ошибок имеет некоторые недостатки. Сначала он использует оператор подавления ошибок, поэтому вы не можете легко восстановить проблемы, если в этой части кода есть некоторые. Кроме того, стандартная ошибка, если undefined загрязняет поиск криков. Ваш код не так выражен, насколько это возможно. Другой потенциальной проблемой является использование недопустимого значения индекса, например. инъекции объектов для индексов и т.д. Это будет незаметно.

Это предотвратит предупреждения. Однако, если вы хотите разрешить другие значения по умолчанию, вы можете инкапсулировать доступ к смещению массива через интерфейс ArrayAccess:

class PigArray implements ArrayAccess
{
    private $array;
    private $default;

    public function __construct(array $array, $default = NULL)
    {
        $this->array   = $array;
        $this->default = $default;
    }

    public function offsetExists($offset)
    {
        return isset($this->array[$offset]);
    }

    public function offsetGet($offset)
    {
        return isset($this->array[$offset]) 
            ? $this->array[$offset] 
            : $this->default
            ;
    }

    public function offsetSet($offset, $value)
    {
        $this->array[$offset] = $value;
    }

    public function offsetUnset($offset)
    {
        unset($this->array[$offset]);
    }
}

Использование:

$array = array_fill_keys(range('A', 'C'), 'value');
$array = new PigArray($array, 'default');
$a     = $array['A'];   # string(13) "value"
$idx   = $array['IDX']; # NULL "default"

var_dump($a, $idx);

Демо: https://eval.in/80896

Ответ 2

В PHP7 появился оператор null coalesce ??. Предполагая, что вам повезло запустить его, вы можете просто сделать

$x = $array['idx'] ?? null;

Ответ 3

Объявите свои переменные и дайте им некоторое начальное значение.

$x = NULL;
$y = 'something other than NULL';

теперь, если у вас есть массив $myArray с ключами x и y, функция extract перепишет начальные значения (вы также можете настроить его не)

$myArray['x'] = 'newX';
extract($myArray);
//$x is now newX

Если ключей нет, исходные значения переменных остаются. Он также будет помещать другие ключи массива в соответствующие переменные.

Ответ 4

Я бы сказал, используйте вспомогательную функцию для взаимодействия с вашим массивом.

function getValue($key, $arr, $default=null) {
   $pieces = explode('.', $key);
   $array = $arr;

   foreach($pieces as $array_key) {

      if(!is_null($array) && is_array($array) && array_key_exists($array_key, $array)) { 
          $array = $array[$array_key];
      }
      else {
          $array = null;
          break;
      }
   }
   return is_null($array) ? $default : $array;
}

$testarr = [
    ['foobar' => 'baz'],
    ['active' => false]
];
$output = getValue('0.foobar',$testarr,'NOT FOUND');
var_dump($output);
$output = getValue('0',$testarr,'NOT FOUND');
var_dump($output);
$output = getValue('1.active',$testarr,'NOT FOUND');
var_dump($output);
$output = getValue('i.do.not.exist',$testarr,'NOT FOUND');
var_dump($output);

Таким образом вы можете предоставить значение по умолчанию вместо нулевого значения по своему усмотрению, вам не нужно восстанавливать массив в качестве другого объекта, и вы можете запросить любое значение как глубоко вложенное, как вы хотите, без необходимости проверять "родительский", массивы.

https://ideone.com/11jtzj