繁体   English   中英

PHP 中关联数组的默认值,如果键不存在

[英]Default value for an associative array in PHP, if key not present

注意: 如果键不存在,我已经阅读 Function 设置关联数组的默认值和 PHP 中关联数组的默认值

比方说:

$a = array('foo' => '123');
$b = $a['bar'];       // PHP Notice:  Undefined index: bar

如果密钥不存在, ""希望默认有一个空字符串,而不是 PHP 通知。

我知道解决方案是:

$b = isset($a['bar']) ? $a['bar'] : "";
// or, since PHP 5.3:
$b = $a['bar'] ?: "";      // but this still produces a "PHP Notice"!

有没有办法避免?: ""并直接拥有:

$b = $a['bar'];

得到""没有通知?


注意:这存在于 Python 中:

import collections
d = collections.defaultdict(str)
print(d['bar'])   # empty string, no error

号 PHP arrays 不能那样工作。

要实现类似的简单性,您可以使用 class。 然后你可以写,

$a = new FakeArray([ 'foo' => '123' ]);

$a->setDefault('baz');

$b = $a->bar; // $b is now 'baz'.
$c = $a->foo; // $c is now '123'.

并让$a使用魔术 getter 返回您选择的默认值。

再三考虑,我认为您可以扩展ArrayObject并非常接近您想要的。

您必须使用默认值预先填充数组或创建 object class 以处理默认响应(也请查看魔术方法__get()

$array = array('foo' => '123') + array('foo' => '', 'bar' => '');

var_dump( $array );

array(2) {
  ["foo"]=>string(3) "123"
  ["bar"]=> string(0) ""
}

如上所述,我想使用数组ArrayObject提交另一个解决方案

这扩展了 class 并稍微调整offsetGet行为以始终返回空字符串

这里的parent::语句调用扩展 class 的 function

class MyArrayObject extends ArrayObject
{
   function offsetGet( $key )
   {
     return parent::offsetExists( $key ) ? parent::offsetGet( $key ) : '';
   }
}

$myArray = new MyArrayObject( array( 'foo' => '123') );

var_dump( $myArray['foo'] ); // '123' provided string
var_dump( $myArray['bar'] ); // '' our new default
var_dump( isset( $myArray['foo'] ) ); // true
var_dump( isset( $myArray['bar'] ) ); // false

foreach( $myArray as $key )
{
    var_dump( $key ); // only one iteration of '123'
}

var_dump( is_array( $myArray ) ); // false unfortunately
var_dump( is_iterable( $myArray ) ); // true however

var_dump( array_merge( array(), $myArray ) ); // will fail
var_dump( array_merge( array(), (array) $myArray ) ); // will work

最后

$myArray['bar'] = '456'; // now if we set bar
var_dump( $myArray['bar'] ); // '456' new value
var_dump( isset( $myArray['bar'] ) ); // now true

您可以在键之前使用此方法@:

echo @$a['bar'];

1 步 - 添加此 function:

function getIfIsset(array $array, string $key)
{
    return $array[$key] ?? '';
}

2步 - 使用这个:

echo getIfIsset($mayArray, 'bar');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM