基于索引值的联合二维数组

时间:2014-02-27 10:44:19

标签: php arrays union

我有两个数组,

$ 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']);
                    }
       )
     ); 

但结果并不像预期的那样

2 个答案:

答案 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;
 }

谢谢