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

Ale*_*lex 19 php zend-framework

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

$x = isset($array['idx']) ? $array['idx'] : null;
// and
$x = !empty($array['idx']) ? $array['idx'] : null;
Run Code Online (Sandbox Code Playgroud)

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

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

就像是:

$x = get_if_set($array['idx']);
// or 
$x = Zend_XXX($array, 'idx')
Run Code Online (Sandbox Code Playgroud)

Yas*_*mez 29

PHP7引入了null coalesce运算符 ??.假设你很幸运能够运行它,你就可以做到

$x = $array['idx'] ?? null;
Run Code Online (Sandbox Code Playgroud)

  • @ToolmakerSteve 这是不正确的。Elvis 运算符抑制通知(就像 `isset` 一样),然后返回右侧的值。自己尝试一下。 (6认同)

hak*_*kre 22

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

$x = @$array['idx'];
Run Code Online (Sandbox Code Playgroud)

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

它会阻止警告.但是,如果您还想允许其他默认值,则可以通过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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

$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);
Run Code Online (Sandbox Code Playgroud)

演示:https://eval.in/80896