我有两个数组,
$ ARRAY1
$array1[]=array('subscribers'=>2,'dt_date'=>'2014-02-27');
$array1[]=array('subscribers'=>2,'dt_date'=>'2014-02-25');
$array1[]=array('subscribers'=>1,'dt_date'=>'2014-02-07');
$数组2
$array2[]=array('unsubscribers'=>1,'dt_date'=>'2014-02-27');
$array2[]=array('unsubscribers'=>1,'dt_date'=>'2014-02-01');
我需要从两个数组
创建一个如下所示的数组 $result[]=array('subscribers'=>2,'unsubscribers'=>1,'dt_date'=>'2014-02-27');
$result[]=array('subscribers'=>2,'unsubscribers'=>0,'dt_date'=>'2014-02-25');
$result[]=array('subscribers'=>1,'unsubscribers'=>0,'dt_date'=>'2014-02-07');
$result[]=array('subscribers'=>0,'unsubscribers'=>1,'dt_date'=>'2014-02-01');
我试过
$result = array_merge_recursive($aray1, $array2);
和
$result = array_merge($array1,
array_udiff($array2, $array1,
function($array1,$array2){
return strcmp($array1['dt_date'],$array2['dt_date']);
}
)
);
但结果并不像预期的那样
答案 0 :(得分:1)
实际上,您的问题可以通过一些foreach
内容解决,但我注意到您尝试模拟某种SQL JOIN
行为(ON
列为dt_date
function reindexArray($array, $column)
{
return array_combine(
array_map(function($x) use ($column)
{
return $x[$column];
}, $array),
$array
);
}
)。这就是为什么我花了一些时间并创造出更常见的解决方案。
首先,我们需要重新索引数组,以便我们更快地使用它们:
function arrayJoin($array1, $array2, $column, $default=null)
{
//in PHP 5.5 it's just array_column() call:
$array1 = reindexArray($array1, $column);
$array2 = reindexArray($array2, $column);
$blank1 = array_combine(
array_keys(current($array1)),
array_fill(1, count(current($array1)), $default)
);
$blank2 = array_combine(
array_keys(current($array2)),
array_fill(1, count(current($array2)), $default)
);
unset($blank1[$column], $blank2[$column]);
return array_merge(
array_map(function($x) use ($array1, $blank2)
{
return array_merge($array1[$x], $blank2);
}, array_keys(array_diff_key($array1, $array2))),
array_map(function($x) use ($array1, $array2)
{
return array_merge($array1[$x], $array2[$x]);
}, array_keys(array_intersect_key($array1, $array2))),
array_map(function($x) use ($array2, $blank1)
{
return array_merge($array2[$x], $blank1);
}, array_keys(array_diff_key($array2, $array1)))
);
}
上面的函数可以很容易地用array_column()
调用替换,但我假设你有PHP 5.3,因此你需要“手动”重新索引。
接下来,加入逻辑:
$default
- 你可以看到,你还需要决定如何处理每个连接数组的非设置键。 $result = arrayJoin($array1, $array2, 'dt_date', 0);
会为您填写这些值。因此,您的问题将通过以下方式解决:
JOIN
- 检查此demo。
但是,如果您的原始数组是从某个SQL数据库派生的,那么将{{1}}逻辑放在那里会更好 - 因为DB的意图是存储数据和数据。正确选择它。
答案 1 :(得分:0)
我找到了答案
$result= array_replace_recursive($array1,$array2);
foreach ($result as $key => $value) {
if(!isset($value['unsubscribers']))
$result[$key]['unsubscribers']=0;
if(!isset($value['subscribers']))
$result[$key]['subscribers']=0;
}
谢谢