安全地获取已定义和未定义索引的数组元素值

时间:2012-04-24 15:16:25

标签: php zend-framework

我已经厌倦了编写三元表达式来清理数据,例如:

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

是否有原生方式 ZF访问器/过滤器来获取某些给定数组的数组元素值,而不是:

  • 停用error_reporting
  • 三元isset / empty检查
  • 错误控制操作符@
  • 创建我自己的全局函数或应用程序访问器/过滤器

类似的东西:

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

4 个答案:

答案 0 :(得分:25)

PHP7引入了null coalesce operator ??。假设你很幸运能够运行它,你可以做到

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

答案 1 :(得分:22)

只要您只需要NULL作为“默认”值,就可以使用错误抑制运算符:

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

批评: 使用错误抑制运算符有一些缺点。首先它使用error suppression operator,因此如果代码的那部分有一些问题,则无法轻松恢复问题。此外,如果未定义标准错误情况会污染寻找尖叫声。你的代码并不像它本身那样精确地表达自己。另一个潜在的问题是使用无效索引值,例如为索引等注入对象。这将被忽视。

它会阻止警告。但是,如果您还想允许其他默认值,则可以通过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 :(得分:0)

声明你的变量并给它们一些初始值。

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

现在如果你有一个带有x和y键的数组$ myArray,则提取函数将覆盖初始值(你也可以不配置它)

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

如果没有键,则保留变量的初始值。它还会将其他数组键放在各自的变量中。

答案 3 :(得分:0)

我想说,使用辅助函数来连接你的数组。

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);

这样你可以根据自己的喜好提供默认值而不是null,你不需要将数组恢复为另一个对象,你可以根据需要深入嵌套请求任何值,而不必检查“父”阵列。

https://ideone.com/11jtzj