1

以下に示すように、2つの配列があります。最終的に 3 番目の配列に示すような構造を取得できるように、配列の内容をマージする必要があります。array_merge を確認しましたが、これが可能な方法がわかりません。どんな助けでも感謝します。ありがとう。

array(
    (int) 0 => array(
        'gross_value' => '100',
        'quantity' => '1'
    ),
    (int) 1 => array(
        'gross_value' => '200',
        'quantity' => '1'
    )
)

array(
(int) 0 => array(
    'item_title_id' => '1',
    'order_id' => '4'
),
(int) 1 => array(
    'item_title_id' => '2',
    'order_id' => '4'
)
)

このようなマージされた配列を取得する必要があります

array(
(int) 0 => array(
    'gross_value' => '100',
    'quantity' => '1',
    'item_title_id' => '1',
    'order_id' => 4
),
(int) 1 => array(
    'gross_value' => '200',
    'quantity' => '1',
    'item_title_id' => '2',
    'order_id' => 4
)

)

4

5 に答える 5

2

array_merge_recursiveを使用します:

すべての数値キーを文字列に変換します (make は連想配列です)

$result = array_merge_recursive($ar1, $ar2);
print_r($result);

ライブデモはこちら

于 2013-05-14T11:19:25.467 に答える
1

どうですか:

$arr1 = array(
    0 => array(
        'gross_value' => '100',
        'quantity' => '1'
    ),
    1 => array(
        'gross_value' => '200',
        'quantity' => '1'
    )
);
$arr2 = array(
    0 => array(
        'item_title_id' => '1',
        'order_id' => '4'
    ),
    1 => array(
        'item_title_id' => '2',
        'order_id' => '4'
    )
);
$arr = array();
foreach($arr1 as $k => $v) {
    array_push($arr, array_merge($v, $arr2[$k]));
}
print_r($arr);

出力:

Array
(
    [0] => Array
        (
            [gross_value] => 100
            [quantity] => 1
            [item_title_id] => 1
            [order_id] => 4
        )

    [1] => Array
        (
            [gross_value] => 200
            [quantity] => 1
            [item_title_id] => 2
            [order_id] => 4
        )

)

array_mergeを見てください

于 2013-05-14T11:18:10.293 に答える
0

マージ再帰などの問題は、いつ停止するかわからないことです。

一部のシナリオでは、配列のトラバースを停止し、指定された値が存在する場合は単純に取得したい場合があります。

たとえば、ネストされた構成配列をオーバーライドする必要がある場合、デフォルトのキーを特定のレベルに固定したくない場合があります。

ここに私の解決策があります:

public static function merge_lvl2(){
    $args = func_get_args();
    return static::merge($args, 2);
}

public static function merge($args, $maxDepth = null, $depth = 1)
{
    $merge = [];
    foreach($args as $arg) {
        if (is_array($arg)) {
            if (is_array($merge)) {
                if ($maxDepth == $depth) {
                    $arg += $merge;
                    $merge = $arg;
                } else {
                    $merge = array_merge($merge, $arg);
                }
            } else {
                $merge = $arg;
            }
        }
    }
    if ($maxDepth !== $depth) {
        foreach($args as $a) {
            if (is_array($a)) {
                foreach($a as $k => $v) {
                    if (isset($merge[$k]) && is_array($merge[$k])) {
                        $merge[$k] = static::merge([$merge[$k], $v], $maxDepth, $depth + 1);
                    }
                }
            }
        }
    }
    return $merge;
}

必要な数の配列をマージして渡すことができます。

$merged = ClassName::merge_lvl2([..array1..], [..array2..], [..array3..], etc...);

レベル 2 でマージを停止し、キーの最後のインスタンスをマージではなくオーバーライドとして受け入れます。

引数の配列を指定してマージを直接呼び出し、最大深度を設定することもできます。

最大深度が設定されていない場合、配列全体をトラバースします。

于 2014-09-18T10:01:04.160 に答える
0

おそらく配列を繰り返し処理し、それらを手動でマージします。

$result = array();
foreach ( $array1 as $key => $item )
{
    $result[$key] = array_merge($array1[$key], $array2[$key]);
}

ただし、最上位の配列に厳密に一致するキーがない場合、問題が発生します。

于 2013-05-14T11:13:59.250 に答える
0

$array1 と $array2 がある場合は、これを試してください。

foreach($array1 as $key1=>$innerArray){
    $array1[$key1]['item_title_id'] = $array2[$key1]['item_title_id'];
    $array1[$key1]['order_id'] = $array2[$key1]['order_id'];
}
于 2013-05-14T11:14:03.213 に答える