2

1 つに結合したい 2 つの配列があります。両方の配列には共通のキー=>値があり、一方の配列の値をもう一方の配列に挿入して、1 つの配列を作成したいと考えています。

配列 1

配列
(
    [0] => 配列
        (
            [ID] => 123456
            [キー] => 1000
            [値] => 123.45
        )

    [1] => 配列
        (
            [ID] => 789012
            [キー] => 1001
            [値] => 56748.17
        )

)

アレイ 2

配列
(
    [0] => 配列
        (
            [キー] => 1000
            [説明] => desc1
        )

    [1] => 配列
        (
            [キー] => 1001
            [説明] => desc2
        )

結果の配列が次のようになるように、配列 2 を配列 1 と結合したいと思います。

配列
(
    [0] => 配列
        (
            [ID] => 123456
            [キー] => 1000
            [値] => 123.45
            [説明] => desc1
        )

    [1] => 配列
        (
            [ID] => 789012
            [キー] => 1001
            [値] => 56748.17
            [説明] => desc2
        )

)

したがって、配列は [Key] 値をキーとして使用して結合されています。array_merge と他の関数を見てきましたが、これらの 2 つの配列を適切に「マージ」できないようです。

どんな助けでも大歓迎です。

4

4 に答える 4

0

$array1[$i]に対応することを常に保証できる場合、@radashkのソリューションは機能し$array2[$i]ます。質問を読んだところ、それは保証されていませんが、代わりに、それを確認し$array1[$i]['Key'] == $array2[$j]['Key']、それらのキーが一致する要素を結合する必要があります。

もっとエレガントな解決策があるかもしれませんが、私は次のようにします:

    // builds up new $tmpArray, using the Key as the index
$tmpArray = array();
foreach($array1 as $innerArray1){
            $tmpArray[$innerArray1['Key']] = $innerArray1;
}

    //Merges the values from $array2 into $tmpArray
foreach($array2 as $innerArray2) {
            if (isset($tmpArray[$innerArray2['Key']])) {
                $tmpArray[$innerArray2['Key']] = array_merge($tmpArray[$innerArray2['Key']], $innerArray2);
            }else{
                $tmpArray[$innerArray2['Key']] = $innerArray2;
            }

}
于 2012-08-31T17:51:46.467 に答える
0

これが私のアプローチです:

$temp_ array = array_fill_keys (array_map(create_function('$a', 'return $a["Key"];'), $array_1) , $array_1);
$result = array();
foreach ($array_2 as $item) {
    if (isset($temp_array[$item['Key']])) {
        $result[] = array_merge($item, $temp_array[$item['Key']]);
    }
}

上記のコードをさらに詳しく説明し、この改良版にたどり着きました。

function array_merge_items_by_common_key_value($key, $array_1, $array_2)
{
    $result = array();
    $temp_ array = array_fill_keys(array_map(create_function('$a', 'return $a["' . $key . '"];'), $array_1) , $array_1);
    foreach ($array_2 as $item)
    {
        $result[$item[$key]] = isset($temp_array[$item[$key]]) ? array_merge($item, $temp_array[$item[$key]]) : $item;
    }
    return array_values(array_merge($result, array_diff_key($array_1, $result)));
}

$merged_arrays = array_merge_items_by_common_key_value('Key', $temp_array, $array_2);

まず、一時的な配列が作成されます。これは $array_1 と同じですが、そのキーは一致する値です。

次に、$array_2 がループされます。一致が見つかると、マージが実行されます。一致するものがない場合、$array_2 の値はそのまま維持されます。

最後に、一致しなかった $array_1 の値も、結果の配列に追加されます。

したがって、$array_1 または $array_2 の両方のアイテムが失われることはありませんが、一致したアイテムはマージされます。

于 2012-08-31T17:59:02.510 に答える
0

あなたは次のようなことをしなければならないでしょう

$result = array();    

foreach ($a1 as $v1)
{
    foreach ($a2 as $k2 => $v2)
    {
        if ($v1['Key'] === $v2['Key'])
        {
            $result[] = array_merge($v1, $v2);
            unset($a2[$k2]);
            break;
        }
    }
}

for ループのあるバージョン

$result = array();

$c_a1 = count($a1);
$c_a2 = count($a2);

for ($i = 0; $i < $c_a1; $i++)
{
    for ($j = 0; $j < $c_a2; $j++)
    {
        if ($a1[$i]['Key'] === $a2[$j]['Key'])
        {
            $result[] = array_merge($a1[$i], $a2[$j]);
            unset($a2[$j]);
            $c_a2--;
            break;
        }
    }
}
于 2012-08-31T17:46:20.740 に答える
0

これを試してください、その線形

$keyval = array();

foreach($array1 as $item)$keyval[$item['Key']] = $item['value'];
foreach($array2 as $key=>$item)$array2[$key]['description'] = isset($keyval[$item['Key']]) ? $keyval[$item['Key']] : '';
于 2012-08-31T17:47:30.133 に答える