合并多个数组而不覆盖第一个找到的值

时间:2013-12-15 18:29:33

标签: php arrays

我正在尝试合并来自不同对象的一组数组。假设我有这样的设置:

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',
)

我希望存储第一个无默认值。这样做的快速方法是什么?

1 个答案:

答案 0 :(得分: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"
}