4

array_mergeを実行する配列配列のキーの順序は重要ですか。つまり、下の2番目の配列のキーが最初の配列のキーをオーバーライドしますか。

array1 = array('username' => 'abc', 'level' => 'admin', 'status' => 'active');
array2 = array('level' => 'root', 'status' => 'active', 'username' => 'bcd');

?または、キーの順序は2つの配列で同じである必要がありますか?

4

2 に答える 2

5

マニュアルには、この質問に対する答えが記載されています。

1つ以上の配列の要素をマージして、1つの値が前の配列の最後に追加されるようにします。結果の配列を返します。

入力配列に同じ文字列キーがある場合、そのキーの新しい値が前の値を上書きします。ただし、配列に数値キーが含まれている場合、後の値は元の値を上書きしませんが、追加されます。

したがって、2番目の配列に同じキーがいくつか含まれている場合、2番目の配列のキーは最初の配列のキーを上書きします。

$array1 = array('username' => 'abc', 'level' => 'admin', 'status' => 'active');
$array2 = array('level' => 'root', 'status' => 'active', 'username' => 'bcd');

$new = array_merge($array1, $array2);

print_r($new);

出力:

Array
(
    [username] => bcd
    [level] => root
    [status] => active
)

したがって、2番目の配列のキーが最初の配列の同じキーを上書きしたことがわかります。各配列のキーの順序は重要ではありません。

于 2012-07-25T02:26:02.860 に答える
0

テンプレート配列を使用して出力順序を定義できる代替ソリューションを次に示します。欠落しているフィールドは、nullまたは指定どおりに入力されます。この例では、firstandlastフィールドは。で埋められてい---ます。

数字キーに関する前の回答から強調表示されたテキストに注意してください。

function array_merge_template($array1, $array2, $template, $fill=null) {
    $_template = array_fill_keys($template, $fill);
    return array_intersect_key ( array_replace ( $_template, array_merge($array1, $array2)) , $_template);
}

入力:

$array1 = ['username' =>'abc', 'level' =>'admin', 'status' =>'active', 'foo'=>'x'];
$array2 = ['level' =>'root', 'status' =>'active', 'username' =>'bcd', 'bar'=>'y'];
$template = ['first','level','foo','username','bar','status','last'];

出力:

/* array_merge($array1,$array2) */
[
    "username" =>  "bcd",
    "level"    =>  "root",
    "status"   =>  "active",
    "foo"      =>  "x",
    "bar"      =>  "y"
]

/* array_merge_template($array1,$array2,$template,'---') */
[
    "first"    =>  "---",
    "level"    =>  "root",
    "foo"      =>  "x",
    "username" =>  "bcd",
    "bar"      =>  "y",
    "status"   =>  "active",
    "last"     =>  "---"
]
于 2017-07-27T15:37:03.820 に答える