数组的组合

时间:2013-04-10 12:16:06

标签: php arrays

我试图让下面的代码工作好几个小时,但只是没有成功。

我有这个日期数组:

Array ( [0] => Array ( [0] => 2007 ) 
        [1] => Array ( [0] => 2008 ) 
        [2] => Array ( [0] => 2009 )
        ...
      )

这个加上一个人:

Array ( [0] => Array ( [plus] => 2 [date] => 2007 ) 
        [1] => Array ( [minus] => 1 [date] => 2008 ) 
        [2] => Array ( [minus] => 1 [date] => ) 
        [3] => Array ( [plus] => 1 [date] => 2010 [minus] => 1 )
      )

我一直试图将它们组合成这个:

Array ( [0] => Array ( [date] => 2007 [plus]=> 2)
        [1] => Array ( [date] => 2008 [minus]=> 1)
        [2] => Array ( [date] => 2009 [plusMinus]=> 0)
        [3] => Array ( [date] => 2010 [plus] => 1 [minus]=>1 )
      ...
      )

所以基本上我想检查一下plusMinus数组中是否存在日期数组的值。如果为true,则plusMinus数组中的日期和值将替换日期数组中的条目。 如果为false,则原始日期数组条目由[plusMinus] =>补充。 0键值对。

我试图这样做的方式是:

foreach ($filler as $key1 => $value1) 
       {
            foreach ($plusMinus as $key2 => $value2)
                {
                    if ($value1['0'] !== $value2['date'])
                        {
                            $value1['plusMinus'] = '0';
                            $result2[$key1][] = $value1;
                        }
                        elseif ($value1['0'] == $value2['date'])
                        { 
                            if (array_key_exists('plus',$value2))
                            {
                                $value1['plus'] = $value2['plus'];
                                $result2[$key1][]=$value1;
                            }

                            elseif(array_key_exists('minus',$value2))
                            {
                                $value1['minus'] = $value2['minus'];
                                $result2[$key1][]=$value1;
                            } 

                            elseif(array_key_exists('minus',$value2) &&
                                   array_key_exists('plus',$value2))
                            {

                            }
                        }
                } 
       }

$valuesComplete = array();
            foreach ($result2 as $value) {
                $result2 = $value['0'];
                array_push($valuesIncomplete, $result2);
            }
 return $valuesComplete;

而不是上面描述的预期结果,我得到了这个:

Array ( [0] => Array 
              ( [0] => 2007 [plus] => 2 ) 
                [1] => Array ( [0] => 2008 [plusMinus => 0 ) 
                [2] => Array ( [0] => 2009 [plusMinus] => 0 ) 
                [3] => Array ( [0] => 2010 [plusMinus] => 0 ) 
                [4] => Array ( [0] => 2011 [plusMinus] => 0 ) 
                [5] => Array ( [0] => 2012 [plusMinus] => 0 ) 
                [6] => Array ( [0] => 2013 [plusMinus] => 0 ) 
              )

我错过了什么?谢谢你的帮助!

6 个答案:

答案 0 :(得分:3)

不幸的是,由于输入数据格式,我看不到任何不涉及O(n + m + p)操作的方法。但无论如何,你必须做你必须做的事。

首先,我将从PlusMinus数组中过滤无用的元素开始。由于它已经非常接近所需的输出格式,因此将其作为结果的基础是有意义的。

$temp = array();
foreach ($plusMinus as $item) {
    if (!empty($item['date'])) {
        $temp[$item['date']] = $item;
    }
}

请注意,我使用date作为我们用于构建结果的临时数组的索引。这是为了让您轻松确保结果数组的顺序正确,并快速检查是否需要从Filler数组中添加项目。

接下来,我们需要添加Filler数组中缺少的任何元素:

foreach ($filler as $item) {
    if (!isset($temp[$item[0]])) {
        $temp[$item[0]] = array(
            'date' => $item[0],
            'plusMinus' => 0
        );
    }
}

现在所有数据都以正确的格式存在于数组中,我们只需要sort它:

ksort($temp);

...并将其转换回索引数组:

return array_values($temp);

不需要性能杀死嵌套循环或复杂的流控制。

See it working

答案 1 :(得分:0)

据我了解,您需要添加不在第二个数组中的年份,但首先要添加?

在这种情况下,你可以这样做:

foreach ($filler as $key1 => $value1)
{
    $ok = false;
    foreach ($plusMinus as $key2 => $value2)
    {
        if($value2['date']==$value1[0])
        {
            $ok = true;
            break;
        }
    }

    if(!$ok)
    {
        $plusMinus[$value1[0]]=array('date'=>$value1[0], 'plusMinus'=>0);
    }
}

答案 2 :(得分:0)

<?php

$a1 = array(array( 2007 ),
            array( 2008 )
           );
$a2 = array(array('plus'=>1, 'date'=>2007),
            array('minus'=>1,'date'=>2008),
            array('plus'=>1, 'minus'=>1, 'date'=>2008)
         );

$r = array();

foreach($a1 as $k1=>$d1) {
   $year = $d1[0];
   foreach( $a2 as $k2=>$d2 ) {
      if( $d2['date'] == $year ) {
         $r[$year]['date'] = $year;
         if(isset($d2['plus'])) {
            $r[$year]['plus'] = $d2['plus'];
         }
         if(isset($d2['minus'])) {
            $r[$year]['minus'] = $d2['minus'];
         }
      }
   }
}

print_r($r);

和结果

Array
(
    [2007] => Array
        (
            [date] => 2007
            [plus] => 1
        )

    [2008] => Array
        (
            [date] => 2008
            [minus] => 1
            [plus] => 1
        )

)

答案 3 :(得分:0)

$ar1 = array( array(2007), array(2008), array(2009), array(2010) );

$ar2 = array(
    array("date"=>2007, "plus"=>2),
    array("date"=>2008, "minus"=>1),
    array("date"=>"", "minus"=>1),
    array("date"=>2010, "plus"=>1, "minus"=>1)
);

foreach($ar2 as $key=>$val){
    if(isset($ar1[$key][0]))
        $val["date"] = $ar1[$key][0];
    $ar2[$key] = $val;
}

我不确定我是否理解正确,但这很好......

只有当您确定两个数组“date”等于其他数组时,它才会起作用。

答案 4 :(得分:0)

这样可以正常使用。

我根本不理解你的问题,但如果我明白了,那就是这样: 首先让你的$ datearray更容易理解:

$dateArray = array(2007,2008,2009,2010);
$plusMinus = array(
                    array( 'plus' => 2 ,'date' => 2007),
                    array( 'minus' => 1 ,'date' => 2008),
                    array ( 'minus' => 1 , 'date' => '' ),
                    array ( 'plus' => 1 , 'date' => 2010 , 'minus' => 1 )
              );

你可以在以后使它多维; 之后:

foreach($dateArray as $k=>$v)
{
    if(in_array($v,$plusMinus[$k]))
    {
        $filler[$k] = $plusMinus[$k];
    }
    else{
        if(empty($plusMinus[$k]['date']))
        {
            $filler[$k]['date']= $v;
            $filler[$k]['plusMinus'] = 0;
        }
    }
}

如果您的数组总是具有您描述的结构,这是简单,干净,可理解的方式,这意味着2007年的plusMinus值在单元格[0]中,而dateArrays中的2007也在单元格中[0]就像你所表明的那样。我希望我能提供帮助。

答案 5 :(得分:0)

这就是我提出的:

为了不创建两个数组的产品(foreach in foreach),我首先使用 date 索引$plusMinus数组。这将允许快速测试一年是否存在:

$years = array_combine(array_column($plusMinus, 'date'), $plusMinus);

这使用了PHP 5.5的array_column()功能,如果你没有它,你可以easily create it your own

完成后,完全你是如何用自己的话写的:

foreach($date as &$entry)
{
    list($year) = $entry;
    $entry = array('date' => $year);
    // check if a value of the date array exists in the plusMinus array.
    if (isset($years[$year])) {
        // If true the date and values from the plusMinus array shall replace the entry in the date array
        $entry += $years[$year];
    } else {
        //  If false, the original date array entry is complemented by a [plusMinus] => 0 key-value pair.
        $entry += array('plusMinus' => 0);
    }
}
unset($entry);

See it i action