2013-04-10 40 views
3

我试图让下面的代码工作好几个小时,但只是不成功。数组的组合

我有这个日期数组:

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

这plusMinus之一:

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

我可能只是完全想念它,但是不要错过$ valuesComplete和$ valuesIncomplete? – Borniet 2013-04-10 12:20:14

+0

首先,为了简洁起见,请使用其它elseifs并使用continue(在循环中)来查看你在做什么,请...我不明白为什么人们将事情复杂化以便陷入困境...... :) – Ihsan 2013-04-10 12:22:39

回答

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

不幸的是,因为输入数据格式的,我看不出有什么办法做到这一点,不涉及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

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

我不知道如果我理解正确,但能正常工作...

这将只工作,如果你确信你的两个数组“日期”等于一个其他..

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]和2007年在dateArrays中也像你所显示的那样在单元格[0]中。我希望我能帮上忙。

0

这是我想出了:

不创建两个阵列的产品(内部的foreach的foreach),我第一个索引$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