$arr1
是匿名对象的关联数组:
array
15898 =>
object(stdClass)[8]
public 'date' => int
$ arr2是另一个具有两个(或更多,它不固定)属性的关联数组:
array
15898 =>
object(stdClass)[10]
public 'fruits'
public 'drinks'
在处理对象时,我找不到任何交叉和内容融合的功能。基本上我想获得:
array
15898 =>
object(stdClass)[8]
public 'date' => int
public 'fruits'
public 'drinks'
问题是:这甚至可能吗?
答案 0 :(得分:1)
如果我理解正确: -
$key = 15898;
$a[$key] = (object) array('date'=>time());
$b[$key] = (object) array('date2'=>time());
$c[$key] = (object) array_merge(get_object_vars($a[$key]),
get_object_vars($b[$key]));
var_dump($c);
以上是在get_object_vars
上使用来提取属于对象$ a,$ b,
的所有属性
并将其合并到一个新数组,然后执行转换为对象
通过这种方式,您可以将对象$ a,$ b中的所有属性(公共)分配给$ c
答案 1 :(得分:0)
只需将$arr1
中所有对象的所有属性设置为$arr2
的副本,即合并数组arr_merged
,然后:
$arr_merged = $arr2;
foreach ($arr1 as $key => $obj)
{
foreach ($obj as $property => $value)
{
$arr_merged[$key]->$property = $value;
}
}
适用于所有可见属性(通常这些属性对于您的问题中的对象是公开的)。根据哪些对象应取代什么,您可能希望将$arr1
与$arr2
交换。在此示例中,$arr1
中的对象属性将覆盖$arr2
中的同名属性。
与array_replace_recursive
不同,PHP中对于stdClass类型的对象没有类似的函数。您可以将两个对象数组转换为数组数组,然后使用该函数:
# convert objects to arrays
foreach(array('arr1', 'arr2') as $var)
$$var = array_map('get_object_vars', $$var);
$arr_merged = array_replace_recursive($arr1, $arr2);
# convert arrays to objects
array_walk($arr_merged, function(&$v) {$v = (object) $v;});
对于我来说这看起来并不是更有用,因为它不像foreach那样清晰。可能如果你经常需要这些功能,你可以考虑将它包装成一个名字很好的函数。