2017-12-05 18 views
1

2つのPHPアレイを3つ目にマージしたいのですが、それらを同じキーdataに依存させたいと思います。私はdataキーを2つの配列に持っています。私は最初にarrayに依存したい。最初の配列をfinal_array()にロードし、次にESTYMACJAを2番目のarrayから3番目のキーを追加しますが、同じdataからdataのキーをfinal_array()にロードします。 final_array()dataキーがない場合、アルゴリズムはfinal_array()にこのキーを追加し、WYKONANIAを追加し、ESTYMACJAを追加する必要があります。可能であれば、私はESTYMACJAdataの残りの部分にコピーしていたでしょう。私はfinal_array()の期待の意味を示します。同じキーに応じてテーブルをマージする

第一の配列:

$my_array=[ 
    ['data'=>'2017-11-27','ESTYMACJA'=>5000], 
    ['data'=>'2017-11-30','ESTYMACJA'=>9000] 
]; 

第二の配列:

$new_array=[ 
    ['data'=>'2017-11-01','WYKONANIA'=>3], 
    ['data'=>'2017-11-02','WYKONANIA'=>10], 
    ['data'=>'2017-11-03','WYKONANIA'=>303], 
    ['data'=>'2017-11-04','WYKONANIA'=>327], 
    ['data'=>'2017-11-05','WYKONANIA'=>652], 
    ['data'=>'2017-11-06','WYKONANIA'=>812], 
    ['data'=>'2017-11-07','WYKONANIA'=>817], 
    ['data'=>'2017-11-08','WYKONANIA'=>870], 
    ['data'=>'2017-11-09','WYKONANIA'=>1070], 
    ['data'=>'2017-11-10','WYKONANIA'=>1199], 
    ['data'=>'2017-11-11','WYKONANIA'=>1206], 
    ['data'=>'2017-11-12','WYKONANIA'=>1220], 
    ['data'=>'2017-11-13','WYKONANIA'=>1421], 
    ['data'=>'2017-11-14','WYKONANIA'=>1440], 
    ['data'=>'2017-11-15','WYKONANIA'=>1904], 
    ['data'=>'2017-11-16','WYKONANIA'=>1910], 
    ['data'=>'2017-11-17','WYKONANIA'=>1962], 
    ['data'=>'2017-11-18','WYKONANIA'=>2234], 
    ['data'=>'2017-11-19','WYKONANIA'=>2305], 
    ['data'=>'2017-11-20','WYKONANIA'=>2325], 
    ['data'=>'2017-11-21','WYKONANIA'=>2250], 
    ['data'=>'2017-11-22','WYKONANIA'=>2263], 
    ['data'=>'2017-11-23','WYKONANIA'=>2821], 
    ['data'=>'2017-11-24','WYKONANIA'=>2890], 
    ['data'=>'2017-11-25','WYKONANIA'=>3411], 
    ['data'=>'2017-11-26','WYKONANIA'=>3443], 
    ['data'=>'2017-11-27','WYKONANIA'=>3501], 
    ['data'=>'2017-11-28','WYKONANIA'=>4032] 
]; 

final_array()期待:

Array 
(
    [0] => Array 
     (
      [data] => 2017-11-01 
      [WYKONANIA] => 3 
      [ESTYMACJA] => 5000 
     ) 

    [1] => Array 
     (
      [data] => 2017-11-02 
      [WYKONANIA] => 10 
      [ESTYMACJA] => 5000 
     ) 

    [2] => Array 
     (
      [data] => 2017-11-03 
      [WYKONANIA] => 303 
      [ESTYMACJA] => 5000 
     ) 

    [3] => Array 
     (
      [data] => 2017-11-04 
      [WYKONANIA] => 327 
      [ESTYMACJA] => 5000 
     ) 

    [4] => Array 
     (
      [data] => 2017-11-05 
      [WYKONANIA] => 652 
      [ESTYMACJA] => 5000 
     ) 

    [5] => Array 
     (
      [data] => 2017-11-06 
      [WYKONANIA] => 812 
      [ESTYMACJA] => 5000 
     ) 

    [6] => Array 
     (
      [data] => 2017-11-07 
      [WYKONANIA] => 817 
      [ESTYMACJA] => 5000 
     ) 

    [7] => Array 
     (
      [data] => 2017-11-08 
      [WYKONANIA] => 870 
      [ESTYMACJA] => 5000 
     ) 

    [8] => Array 
     (
      [data] => 2017-11-09 
      [WYKONANIA] => 1070 
      [ESTYMACJA] => 5000 
     ) 

    [9] => Array 
     (
      [data] => 2017-11-10 
      [WYKONANIA] => 1199 
      [ESTYMACJA] => 5000 
     ) 

    [10] => Array 
     (
      [data] => 2017-11-11 
      [WYKONANIA] => 1206 
      [ESTYMACJA] => 5000 
     ) 

    [11] => Array 
     (
      [data] => 2017-11-12 
      [WYKONANIA] => 1220 
      [ESTYMACJA] => 5000 
     ) 

    [12] => Array 
     (
      [data] => 2017-11-13 
      [WYKONANIA] => 1421 
      [ESTYMACJA] => 5000 
     ) 

    [13] => Array 
     (
      [data] => 2017-11-14 
      [WYKONANIA] => 1440 
      [ESTYMACJA] => 5000 
     ) 

    [14] => Array 
     (
      [data] => 2017-11-15 
      [WYKONANIA] => 1904 
      [ESTYMACJA] => 5000 
     ) 

    [15] => Array 
     (
      [data] => 2017-11-16 
      [WYKONANIA] => 1910 
      [ESTYMACJA] => 5000 
     ) 

    [16] => Array 
     (
      [data] => 2017-11-17 
      [WYKONANIA] => 1962 
      [ESTYMACJA] => 5000 
     ) 

    [17] => Array 
     (
      [data] => 2017-11-18 
      [WYKONANIA] => 2234 
      [ESTYMACJA] => 5000 
     ) 

    [18] => Array 
     (
      [data] => 2017-11-19 
      [WYKONANIA] => 2305 
      [ESTYMACJA] => 5000 
     ) 

    [19] => Array 
     (
      [data] => 2017-11-20 
      [WYKONANIA] => 2325 
      [ESTYMACJA] => 5000 
     ) 

    [20] => Array 
     (
      [data] => 2017-11-21 
      [WYKONANIA] => 2250 
      [ESTYMACJA] => 5000 
     ) 

    [21] => Array 
     (
      [data] => 2017-11-22 
      [WYKONANIA] => 2263 
      [ESTYMACJA] => 5000 
     ) 

    [22] => Array 
     (
      [data] => 2017-11-23 
      [WYKONANIA] => 2821 
      [ESTYMACJA] => 5000 
     ) 

    [23] => Array 
     (
      [data] => 2017-11-24 
      [WYKONANIA] => 2890 
      [ESTYMACJA] => 5000 
     ) 

    [24] => Array 
     (
      [data] => 2017-11-25 
      [WYKONANIA] => 3411 
      [ESTYMACJA] => 5000 
     ) 

    [25] => Array 
     (
      [data] => 2017-11-26 
      [WYKONANIA] => 3443 
      [ESTYMACJA] => 5000 
     ) 

    [26] => Array 
     (
      [data] => 2017-11-27 
      [WYKONANIA] => 3501 
      **[ESTYMACJA] => 5000** 
     ) 

    [27] => Array 
     (
      [data] => 2017-11-28 
      [WYKONANIA] => 4032 
      [ESTYMACJA] => 5000 

     ) 

    *[28] => Array 
     (
      [data] => 2017-11-30 
      [WYKONANIA] => 4032 
      [ESTYMACJA] => 9000 

     ) 

このコードは、すでに私がやったが、イムは今立ち往生ものです。

$x = 0; 
while ($x<count($final_array)) 
{ 
    if ($new_array == null) { 
    break; 
    } 
    else { 
     for ($i = 0; $i < count($new_array); $i++) { 
      if ($final_array[$x]['data'] == ($new_array[$i]['data']) { 
       $final_array[$x]['WYKONANIA'] = $new_array['WYKONANIA']; 
      } 
      else { 
       array_push($final_array, "data", $new_array[$i]['data']); 
       array_push($final_array, "WYKONANIA", $new_array[$i]['WYKONANIA']); 
       array_push($final_array, "ESTYMACJA", $final_array[$x]['ESTYMACJA']); 
      } 
     } 
    } 
    $x++; 
} 

$myArray - first array 
$new_array - second array 
$final_array - final array. 
+0

foreachのは間違っている構文であり、あなたのロジックが間違っているのに役立ちます。 '$ final_array [$ x] ['data'] ==($ new_array [$ i] ['data'])'これは配列の一つのインデックスを比較するだけです。 $ final_array全体に一致するデータ値が含まれているかどうかを確認する必要があります。 – Devon

+0

申し訳ありませんが、 'foreach'の代わりに' for'ループがあるはずです。私の間違い – Piecia1337

+0

....デフォルトの 'ESTYMACJA'値は' $ my_array [0] ['ESTYMACJA'] '(' 5000 ')?デフォルトの 'WYKONANIA'値は' $ new_array'( '4032')の前の要素の' WYKONANIA'の値から来ますか?このロジックは非常に難しいです(私は今あなたの質問を何度も読んだことがあります)。このタスクのロジックを明確にして、デフォルト値の修正を決定してください。 – mickmackusa

答えて

-1

これは

function merge_by_keys(){ 
    $arr = func_get_args(); 
    $num = func_num_args(); 

    $keys = array(); 
    $i = 0; 
    for ($i=0; $i<$num; ++$i){ 
     $keys = array_merge($keys, array_keys($arr[$i])); 
    } 
    $keys = array_unique($keys); 

    $merged = array(); 

    foreach ($keys as $key){ 
     $merged[$key] = array(); 
     for($i=0; $i<$num; ++$i){ 
      $merged[$key][] = isset($arr[$i][$key]) ? $arr[$i][$key] : null; 
     } 
    } 
    return $merged; 
} 
0
// sort my_array in descending order of dates 
rsort($my_array); 

foreach($new_array as &$x) { 
    foreach($my_array as $i) { 
    // Because your dates have a different format, convert them to timestamp 
    if(strtotime($x['data']) > strtotime($i['data'])) { 
     $x['ESTYMACJA'] = $i['ESTYMACJA']; 
     break; 
    } 
    } 
} 

demo

関連する問題