3

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

我有这个日期数组:

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 数组中的日期和值将替换日期数组中的条目。如果为 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 ) 
              )

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

4

6 回答 6

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
        );
    }
}

现在所有数据都以正确的格式保存在数组中,我们只需要对其进行排序

ksort($temp);

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

return array_values($temp);

无需性能扼杀的嵌套循环或复杂的流控制。

看到它工作

于 2013-04-10T12:30:53.783 回答
0

这就是我想出的:

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

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

这使用了array_column()PHP 5.5 的功能,如果您没有它,您可以轻松创建自己的.

这样做之后,这正是你用自己的话写的:

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);

看我行动

于 2013-04-10T12:47:35.487 回答
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);
    }
}
于 2013-04-10T12:30:38.177 回答
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
        )

)
于 2013-04-10T12:30:39.293 回答
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;
}

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

仅当您确定两个数组“日期”彼此相等时,它才会起作用。

于 2013-04-10T12:31:01.473 回答
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] 中就像你展示的那样。我希望我能帮上忙。

于 2013-04-10T12:36:50.030 回答