我已经厌倦了编写三元表达式来清理数据,例如:
$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')
答案 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);
答案 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,你不需要将数组恢复为另一个对象,你可以根据需要深入嵌套请求任何值,而不必检查“父”阵列。