我试图让下面的代码工作好几个小时,但只是没有成功。
我有这个日期数组:
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 )
)
我错过了什么?谢谢你的帮助!
答案 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);
不需要性能杀死嵌套循环或复杂的流控制。
答案 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);