PHP与Python的等价物’;s dict.update

PHP与Python的等价物’;s dict.update,php,Php,Python允许在适当的位置更新字典(即PHP语言中的“关联数组”),如下所示: mydict={'banana':'yellow','apple':'green','blueberry':'blue'} mydict.update({'apple':'red','orange':'orange'}) 我在PHP中最接近这一点的是: $mydict=[“香蕉”=>“黄色”、“苹果”=>“绿色”、“蓝莓”=>“蓝色”]; $mydict=array\u merge($mydict,['apple

Python允许在适当的位置更新字典(即PHP语言中的“关联数组”),如下所示:

mydict={'banana':'yellow','apple':'green','blueberry':'blue'}
mydict.update({'apple':'red','orange':'orange'})
我在PHP中最接近这一点的是:

$mydict=[“香蕉”=>“黄色”、“苹果”=>“绿色”、“蓝莓”=>“蓝色”];
$mydict=array\u merge($mydict,['apple'=>'red','orange'=>'orange']);

作为DRY的支持者,我不喜欢两次输入
$mydict
。有没有一种简洁的方法来解决这个问题?

不完全是这样。最接近的是数组联合运算符
+

$mydict = ['banana' => 'yellow', 'apple' => 'green', 'blueberry' => 'blue'];
$mydict += ['apple' => 'red', 'orange' => 'orange'];
但是,这不会替换现有的键,因此其工作方式与数组合并不同。如果有两个变量而不是文字,则可以保留它们的顺序以获得覆盖效果:

$mydict = [...];
$newvalues = [...];

$newvalues += $mydict;

这是内置方法所能达到的最接近的效果。

数组是一种基本类型。要以面向对象的方式访问它,可以通过扩展来包装它。请注意,结果是一个对象,而不是一个数组。因此,与is_array()的检查将失败

class MyArray extends ArrayObject
{
    public function update(array  $value)
    {
        $this->exchangeArray(array_merge($this->getArrayCopy(),$value));
    }
}

$mydict = ['banana' => 'yellow', 'apple' => 'green', 'blueberry' => 'blue'];
$mydict2 = ['apple' => 'red', 'orange' => 'orange'];

$ta = new MyArray($mydict);

$ta->update($mydict2);

print_r($ta);
这将产生

MyArray Object
(
    [storage:ArrayObject:private] => Array
        (
            [banana] => yellow
            [apple] => red
            [blueberry] => blue
            [orange] => orange
        )

)