注意:我已經閱讀了Function to set default value of associative array if the key is not present and Default values for Associative array in 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
uj5u.com熱心網友回復:
不。PHP 陣列不能那樣作業。
為了實作類似的簡單性,您可以做的是使用類。然后你可以寫,
$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會非常接近你想要的:
class FakeArray extends ArrayObject {
...
public function __get($key) {
return $this->default;
}
}
但是雖然$a['foo'] = 'bar'確實存盤了值,實際上即使訪問不存在的屬性現在也會觸發索引通知:
$b = $a->baz;
PHP Notice: Undefined index: baz in ./test.php ...
因此,ArrayObject實際上比 StdClass表現得更糟。
uj5u.com熱心網友回復:
我想使用ArrayObject上述陣列提交另一個解決方案
這擴展了類并稍微調整了offsetGet行為以始終回傳空字串
parent::這里的陳述句呼叫了擴展類的函式
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
作為@miken32 設定默認值的建議
class MyArrayObject extends ArrayObject
{
protected $default;
public function __construct($array = [], $default = null, $flags = 0, $iteratorClass = "ArrayIterator")
{
parent::__construct( $array, $flags, $iteratorClass );
$this->default = $default;
}
function offsetGet( $key )
{
return parent::offsetExists( $key ) ? parent::offsetGet( $key ) : $this->default;
}
}
您可以通過設定默認值
$myArray = new MyArrayObject( array( 'foo' => '123'), 'mydefault' );
uj5u.com熱心網友回復:
您必須使用您的默認值預先填充您的陣列或創建一個物件類來處理默認回應。
$array = array('foo' => '123') array('foo' => '', 'bar' => '');
var_dump( $array );
array(2) {
["foo"]=>string(3) "123"
["bar"]=> string(0) ""
}
uj5u.com熱心網友回復:
第 1 步 - 添加此功能:
function getIfIsset(array $array, string $key)
{
return $array[$key] ?? '';
}
2 步 - 使用這個:
echo getIfIsset($mayArray, 'bar');
uj5u.com熱心網友回復:
您可以使用此方法 @before 帶鍵的變數:
echo @$a['bar'];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/370090.html
下一篇:在資料庫中插入陣列
