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

2022-08-30 12:52:22

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

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

有没有一种本机方法ZF访问器/过滤器来获取某些给定数组的数组元素值,而无需:

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

像这样:

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

答案 1

PHP7 引入了空合并运算符 。假设你足够幸运地运行它,你可以做??

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

答案 2

自 PHP 7.0 起

事情要容易得多-多亏了Andrea FauldsNikita Popov-Null Coalescing Operator 文档迁移RFC

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

或带 :$default

$x = $array['idx'] ?? $default ?? NULL;

like or 它没有发出警告,并且表达式会向右掉落(如果未设置)。如果设置而不是 NULL,则取值。这也是前面示例中的工作方式,即使未定义,也始终如此。issetempty$default


自 PHP 7.4 起

感谢 Midori Kocak - 是 Null 合并赋值运算符吗?=DocsRFC(这是我之后错过的事情之一)允许直接分配默认值:??

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

到目前为止,我不经常使用它,但很高兴了解它,特别是如果在分解数据处理逻辑并希望尽早具有默认值时。??


原始旧答案


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

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

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

它将防止警告。但是,如果您还想允许其他默认值,则可以通过接口封装对数组偏移量的访问: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


推荐