web-dev-qa-db-ja.com

PHP数値キーを使用したarray_merge

Array_merge()が異なる値を持つ2つのキーを上書きするようにするにはどうすればよいですか?

たとえば、マージ:

[0] => 'whatever'

[0] => 'whatever', [1] => 'a', [2] => 'b'

生産すべき

[0] => 'whatever', [1] => 'a', [2] => 'b'

基本的に、array_mergeは、配列に文字列キーがある場合と同じように動作するようにします...

40
Alex

使用 +演算子。

比較array_mergeから+演算子:

<?php

$a1 = array(0=>"whatever",);
$a2 = array(0=>"whatever",1=>"a",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

出力:

Array
(
    [0] => whatever
    [1] => whatever
    [2] => a
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

+ operator stillは、連想配列に数値キーが順不同の場合に機能します。

<?php

$a1 = array(0=>"whatever",);
$a2 = array(1=>"a",0=>"whatever",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

出力:

Array
(
    [0] => whatever
    [1] => a
    [2] => whatever
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

通知array_merge in this caseは、新しいキーを作成します。望ましくない...

74
AJ.

array_replaceはまさにこれを行います。参照: http://php.net/manual/de/function.array-replace.php

7
HKandulla

手動で書くのはとても簡単です:

function array_merge_custom($first, $second) {
    $result = array();
    foreach($first as $key => $value) {
        $result[$key] = $value;
    }
    foreach($second as $key => $value) {
        $result[$key] = $value;
    }

    return $result;
}

更新:これは、この場合second配列が次の場合に勝つため、ユニオン演算子(return $first + $second;)とは異なる動作をしますどちらも同じキーを持つ要素を持っています。

ただし、引数の場所を切り替えて、firstオペランドとして競合が発生した場合に「勝ちたい」配列を配置すると、次のことができます。同じ動作をします。したがって、上記の関数はreturn $second + $first;とまったく同じように動作します。

7
Jon

私のプロジェクトでは、独自の関数を使用しています

function array_merge_custom(){
    $array = [];
    $arguments  = func_num_args();
    foreach($arguments as $args)
        foreach($args as $key => $value)
            $array[$key] = $value;
    return $array;
}

使用法

$a = array_merge_custom($b, $c, $d, ... .. )
3
Manvel

array_merge($a1,$a2);で同じ結果を得るには、$a2+$a1を使用する必要があります

$a1 = array(
    'k1' => 1,
    'k2' => 2,
    'k3' => 3,
);

$a2 = array(
    'k1' => 11,
    'k2' => 22,
    'k4' => 44,
);

コード:

print_r(array_merge($a1,$a2));

出力:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k3] => 3 
    [k4] => 44 
)

コード:

print_r($a1+$a2);

出力:

Array ( 
    [k1] => 1 
    [k2] => 2 
    [k3] => 3 
    [k4] => 44 
)

コード:

print_r($a2+$a1);

出力:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k4] => 44 
    [k3] => 3 
) 
3

array_merge()を使用してからarray_unique()を使用できます。

0
Scott C Wilson
the solution could be this:
function array_merge_custom($array1, $array2) {
    $mergeArray = [];
    $array1Keys = array_keys($array1);
    $array2Keys = array_keys($array2);
    $keys = array_merge($array1Keys, $array2Keys);

    foreach ($keys as $key) {
        $mergeArray[$key] = array_merge_recursive(isset($array1[$key]) ? $array1[$key] : [], isset($array2[$key]) ? $array2[$key] : []);
    }

    return $mergeArray;
}

$array1 = [
    '66_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    '67_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    '68_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    68 => [
        'k1' => 1,
        'k2' => 1,
    ]
];
$array2 = [
    '66_' => [
        'a1' => 1,
        'a2' => 1,
    ],
    '68_' => [
        'b1' => 1,
        'b2' => 1,
    ],
    68 => [
        'b1' => 1,
        'b2' => 1,
    ]
];
echo '<pre>';
print_r(array_merge_custom($array1, $array2));
0
phvish