2013-04-10 3 views
3

아래의 코드를 몇 시간 동안 작동 시키려고 노력했지만 성공하지 못했습니다.배열 조합

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

이 plusMinus 일 : 그러니까 기본적으로 내가 원하는

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

을 :

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

내가이로 결합하기 위해 노력 해왔다

나는이 날짜 배열이 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

+0

우선 무엇보다도 간결함을 위해 그 elseif를 걷어 차서 계속 사용하십시오. (루프에서) 제발 뭘하고 있는지보십시오 ... 나는 사람들이 문제를 일으키는 것을 복잡하게 만드는 이유를 이해하지 못합니다 ... :) – Ihsan

답변

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 배열에서 쓸모없는 요소를 필터링하는 것으로 시작합니다. 이미 원하는 출력 형식에 매우 근접해 있기 때문에이를 결과의 기본으로 사용하는 것이 좋습니다. 나는 우리가 결과를 만들 때 사용하는 임시 배열의 인덱스로 date을 사용

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

알 수 있습니다. 이렇게하면 결과 배열의 순서가 올바른지 쉽게 확인하고 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]에 있습니다. 내가 도울 수 있기를 바랍니다.

이 두 배열의 제품 (foreach는 내부 foreach 문)을 날짜에, 내가 먼저 인덱스 $plusMinus 배열을 생성하지 :

0

이 내가 생각 해낸 것입니다. 즉 일년에 존재하거나하지 않을 경우 신속하게 테스트 할 수 있습니다 : 당신은 당신이 easily create it your own 수를이없는 경우

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

이, PHP 5.5의 array_column() 함수를 사용합니다.

는 것을 일 후 정확히 당신이 당신 자신의 말로 쓴 방법 :

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.