2013-12-15 54 views
0

我試圖合併一組來自不同對象的數組。可以說,我有這樣的設置:合併多個數組而不覆蓋第一個找到的值

class Base { 
    static $defaults = array (
     'time' => 'DEFAULT', 
     'color' => 'DEFAULT', 
     'friend' => 'DEFAULT', 
     'pub' => 'DEFAULT', 
     'money' => 'DEFAULT', 
    ); 
    static function isDefault ($key, $value) {} 
    $properties; 
} 
class A extends Base { 
    function __construct() { 
     $data = array('time' => '6pm', 'friend' => 'Jack'); 
     $this->properties = array_merge(self::$defaults, $data); 
    }; 
class B extends Base { 
    function __construct() { 
     $data = array('pub' => 'The Lion', 'friend' => 'Jane'); 
     $this->properties = array_merge(self::$defaults, $data); 
    }; 
} 
class C extends Base { 
    function __construct() { 
     $data = array('money' => 'none', 'pub' => 'Queens'); 
     $this->properties = array_merge(self::$defaults, $data); 
    }; 
} 
$sequence = array(new A, new B, new C); 

我所知道的是,對象是在序列和存在所謂properties的數組。我想合併這些陣列,使結果如下所示:

array (
    'time' => '6pm', 
    'color' => 'DEFAULT', 
    'friend' => 'Jack', 
    'pub' => 'The Lion', 
    'money' => 'none', 
) 

我想要第一個沒有默認值存儲。什麼是做這個的快速方法?

+0

什麼是在這種奇怪的方式控制您的設置感?爲什麼你想要新的實例化來改變整個上下文?很難理解(即使你的簡短示例代碼,我需要幾分鐘的時間才能意識到發生了什麼) –

+0

@AlmaDo它是插件系統的一部分,容器需要知道其包含的組中的有效回調。而不是調用每個實例,我想在初始化時構建數組。 – Twifty

回答

1

步驟1:定義ISDEFAULT

static function isDefault ($key, $value) { 
    return($value == self::$defaults[$key]); 
} 

步驟2:環。

<?php 
$result = array(); 
foreach($sequence AS $object){ 
    foreach($object->properties AS $key=>$value){ 
     if(!isset($result[$key]) || Base::isDefault($key, $result[$key])){ 
      $result[$key] = $value; 
     } 
    } 
} 
var_dump($result); 

小提琴:http://phpfiddle.org/main/code/anh-hrc

結果爲:

array(5) { 
    ["time"]=> string(3) "6pm" 
    ["color"]=> string(7) "DEFAULT" 
    ["friend"]=> string(4) "Jack" 
    ["pub"]=> string(8) "The Lion" 
    ["money"]=> string(4) "none" 
} 
+0

工程很棒。謝謝:) – Twifty

+0

我的榮幸:)是一個整潔的挑戰。 – Jessica

相關問題