2017-02-10 9 views
2

私の配列をマージするのに問題があり、何が間違っているのかわかりません。次のコードを考えてみましょう:2つの連想配列を1にマージする

$array1 = [ 
    [ 'job' => '123', 'who' => 'Alpha' ], 
    [ 'job' => '789', 'who' => 'Bravo' ] 
]; 

$array2 = [ 
    [ 'job' => '123', 'when' => 'Today' ] 
]; 

$desiredArray = [ 
    [ 'job' => '123', 'who' => 'Alpha', 'when' => 'Today' ], 
    [ 'job' => '789', 'who' => 'Bravo', 'when' => '' ] 
]; 

これは私がやろうとしていたものである:これはちょっと作品

$newArray = []; 

foreach ($array2 as $row) { 
    foreach ($array1 as $record) { 
     if ($row['job'] === $record['job']) { 
      $tempArray = [ 
       'when' => $row['when'] 
      ]; 
      $newRecord = array_merge($record, $tempArray); 
      array_push($newArray, $newRecord); 
     }; 
    }; 
}; 

が、問題は、一致がない場合、それはまだする必要があります元のレコードを新しい配列に入れてください。私はif文の外にいくつかのものを置こうとしましたが、私のループは固まっています。どんな助けもありがとうございます。

答えて

4

jobをキーとして配列を抽出するとはるかに簡単です。ただ、ループ最初の配列と第二で同じキーをチェックし、マージ:

$a1 = array_column($array1, null, 'job'); 
$a2 = array_column($array2, null, 'job'); 

foreach($a1 as $key => $val) { 
    $result[] = isset($a2[$key]) ? $val + $a2[$key] : $val; 
} 

または内蔵と同じ:

$result = array_replace_recursive(array_column($array1, null, 'job'), 
            array_column($array2, null, 'job')); 

あなたはそれから再インデックスする必要がある場合:

$result = array_values($result); 
+1

これは最高の答えです! – Kitson88

+1

最良の答えは、ループを 'array_replace_recursive($ a1、$ a2)'で置き換えることです。 –

+1

@Ayaou:素晴らしいアイデア!どのように私はあなたに賞を与えるのですか? – AbraCadaver

2

2つの配列のうちの1つから開始し、もう一方とマージします。見つからない何旗:

$newArray = $array1; 

foreach ($array2 as $row) { //You need to eventually deal with all of these somehow 
    $found = false; 
    foreach ($newArray as $key => $record) { 
     if ($row['job'] === $record['job']) { 
      $found = true; 
      $newArray[$key] += $row; //Merge if found 
     } 
    } 
    if (!$found) { 
     $newArray[] = $row; //Append if not found 
    } 
} 
+1

過度に複雑ですが、それは – RiggsFolly

3

私はあなたがループを逆に考えると、私はまた、$array1からアイテムが(だから私はそれを追加することができます)

foreach ($array1 as $row) { 
     $exists = false; 
     foreach ($array2 as $record) { 
      if ($row['job'] === $record['job']) { 
       $tempArray = [ 
        'when' => $record['when'] 
       ]; 
       $newRecord = array_merge($row, $tempArray); 
       array_push($newArray, $newRecord); 
       $exists =true; 
      }; 
     }; 
     if(!$exists){ 
      array_push($newArray, $row);  
     } 
    }; 
$array2に存在していないかどうかをチェックするために $exist変数を追加しました
+1

過度に複雑な動作しますが、それは – RiggsFolly

+3

また、これは 'when'のみ新しいキーではなく、非常に拡張性があることを前提として動作します。 – AbraCadaver

+1

私はこの回答が好きです。私が取ろうとしていたアプローチであり、私が必要としていた欠けている部分を見せてくれましたが、本当に最高のものを見るために他の答えを試すつもりです。私は他の人がパンを外していない場合、これを答えとしてマークします。 – Slime

0

array1にwhenキーを追加します。このようにすることができます。

$jobs_time = array_combine(array_column($array2, 'job'), array_column($array2, 'when')); 
$result = array_map(function($v)use($jobs_time){ 
    $v['when'] = isset($jobs_time[$v['job']]) ? $jobs_time[$v['job']] : ''; 
    return $v; 
}, $array1); 
関連する問題