2017-01-24 1 views
1

Python ermöglicht ein Wörterbuch zu aktualisieren (dh ein „assoziatives Array“ in PHP sprechen) an Ort und Stelle in etwa so:PHP-Äquivalent von Python dict.update

mydict = {'banana': 'yellow', 'apple': 'green', 'blueberry': 'blue'} 
mydict.update({'apple': 'red', 'orange': 'orange'}) 

Das nächstgelegene ich für diese gekommen sind in PHP ist:

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

Als Befürworter von DRY, ich mit nicht wie $mydict zweimal eingeben. Gibt es einen kurzen Weg um ihn herum?

Antwort

1

Nicht genau. Die nächstgelegene erhalten Sie, ist das Array Operator union +:

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

Dies schließt jedoch nicht vorhandenen Schlüssel ersetzen, so funktioniert anders als ein array_merge. Wenn Sie zwei Variablen anstelle von Literalen haben, könnten Sie die Reihenfolge behalten, obwohl die Überschreibungs Effekt zu erhalten:

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

$newvalues += $mydict; 

, die so nahe ist, wie Sie mit integrierten Methoden erhalten werden.

0

Array ist ein primitiver Typ. Um es objektorientiert aufzurufen, können Sie es durch Erweitern ArrayObject umschließen. Achten Sie darauf, dass das Ergebnis ein Objekt und kein Array ist. Daher werden Überprüfungen mit is_array() fehlschlagen.

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); 

wird diese

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

)