34

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

$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

4 回答 4

49

PHP7 引入了空合并运算符 ??。假设你很幸运能够运行它,你可以这样做

$x = $array['idx'] ?? null;
于 2016-06-18T08:17:21.590 回答
31

自 PHP 7.0 起

事情变得容易多了——感谢Andrea FauldsNikita Popov提供的Null Coalescing Operator ??DocsMigrationRFC

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

或带有$default

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

Like issetorempty不给出警告,并且表达式向右下降(如果未设置)。如果设置且不为 NULL,则取值。这也是$default前面示例中的工作方式,即使未定义,也始终如此。


自 PHP 7.4 起

感谢Midori Kocak - 是Null Coalescing Assignment Operator ??=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

于 2012-04-24T19:40:09.707 回答
1

我想说,使用辅助函数与您的数组交互。

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

于 2017-08-28T09:08:48.667 回答
0

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

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

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

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

如果没有键,则保留变量的初始值。它还将其他数组键放入相应的变量中。

于 2012-04-24T16:01:03.377 回答