2013-04-10 80 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