1

各項目の下の数値を合計しながら、2つの多次元配列(深さ4レベル)を組み合わせる必要があります。2つの配列の構造は、上記の値以外は同じです。

Array1:

 Array
(
    [0] => Array
        (
            [item_code] => AB00
            [item_text] => Alcoholic beverages
            [value] => 233
            [children] => Array
                (
                )

        )

    [1] => Array
        (
            [item_code] => AP00
            [item_text] => Apparel and services
            [value] => 1080
            [children] => Array
                (
                    [0] => Array
                        (
                            [item_code] => APC0
                            [item_text] => Apparel, Children under 2
                            [value] => 79
                            [children] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [item_code] => APO0
                            [item_text] => Other apparel products and services
                            [value] => 131
                            [children] => Array
                                (
                                )

                        )

                    [2] => Array
                        (
                            [item_code] => APM0
                            [item_text] => Apparel, Men and boys
                            [value] => 204
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [item_code] => APM2
                                            [item_text] => Apparel, Boys, 2 to 15
                                            [value] => 41
                                            [children] => Array
                                                (
                                                )

                                        )

                                    [1] => Array
                                        (
                                            [item_code] => APM1
                                            [item_text] => Apparel, Men, 16 and over
                                            [value] => 163
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                    [3] => Array
                        (
                            [item_code] => APF0
                            [item_text] => Footwear
                            [value] => 241
                            [children] => Array
                                (
                                )

                        )

                    [4] => Array
                        (
                            [item_code] => APW0
                            [item_text] => Apparel, Women and girls
                            [value] => 425
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [item_code] => APW2
                                            [item_text] => Apparel, Girls, 2 to 15
                                            [value] => 78
                                            [children] => Array
                                                (
                                                )

                                        )

                                    [1] => Array
                                        (
                                            [item_code] => APW1
                                            [item_text] => Apparel, Women, 16 and over
                                            [value] => 347
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

そしてArray2:

 Array
(
    [0] => Array
        (
            [item_code] => AB00
            [item_text] => Alcoholic beverages
            [value] => 296
            [children] => Array
                (
                )

        )

    [1] => Array
        (
            [item_code] => AP00
            [item_text] => Apparel and services
            [value] => 1225
            [children] => Array
                (
                    [0] => Array
                        (
                            [item_code] => APC0
                            [item_text] => Apparel, Children under 2
                            [value] => 73
                            [children] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [item_code] => APO0
                            [item_text] => Other apparel products and services
                            [value] => 163
                            [children] => Array
                                (
                                )

                        )

                    [2] => Array
                        (
                            [item_code] => APF0
                            [item_text] => Footwear
                            [value] => 265
                            [children] => Array
                                (
                                )

                        )

                    [3] => Array
                        (
                            [item_code] => APM0
                            [item_text] => Apparel, Men and boys
                            [value] => 278
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [item_code] => APM2
                                            [item_text] => Apparel, Boys, 2 to 15
                                            [value] => 61
                                            [children] => Array
                                                (
                                                )

                                        )

                                    [1] => Array
                                        (
                                            [item_code] => APM1
                                            [item_text] => Apparel, Men, 16 and over
                                            [value] => 217
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                    [4] => Array
                        (
                            [item_code] => APW0
                            [item_text] => Apparel, Women and girls
                            [value] => 447
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [item_code] => APW2
                                            [item_text] => Apparel, Girls, 2 to 15
                                            [value] => 95
                                            [children] => Array
                                                (
                                                )

                                        )

                                    [1] => Array
                                        (
                                            [item_code] => APW1
                                            [item_text] => Apparel, Women, 16 and over
                                            [value] => 353
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

私の目標は、これら2つの配列を組み合わせて、[value]数値キーを合計することです。これまでの私の進歩:

foreach ($Array2 as $key => $values) {
foreach ($values as $name => $value) {
    if(!is_array($Array1[$key])) {
        $Array1[$key] = array(); 
    }
    $finalArr[$key][$name] += $value;
}

}

私の質問に長らくなってすみません。助けてくれてありがとう。

4

2 に答える 2

2

これにより、2つの配列が再帰的にマージされ、コールバックが適用されて、一致するキーの非配列値をどう処理するかが決定されます。

function array_merge_map_recursive($r1, $r2, $callback) {
    $merged = array();
    foreach ($r1 as $k => $v) {
        if (!isset($r2[$k])) {
            $merged[$k] = $v;
        }
        elseif (!is_array($v)) {
            $merged[$k] = $callback($k,$v,$r2[$k]);
        }
        else {
            $merged[$k] = array_merge_map_recursive($v,$r2[$k],$callback);
        }
    }
    return $merged;
}

キーが「value」の場合、コールバックは2つの要素を合計します。そうでない場合、コールバックは2つの要素をそのままにし、同じでない場合は配列でラップします。キーに関係なく、任意の数値を合計する場合は、最初の値をのifようなものに変更できますif (is_numeric($v1))

この構文にはPHP5.3が必要ですが、以前のバージョン用に非常に簡単に書き直すことができます。

$sumIfValue = function($key,$v1,$v2) {
    if ($key==='value') {
        return $v1 + $v2;
    } elseif ($v1===$v2) {
        return $v1;
    } else {
        return array($v1,$v2);
    }
};

次に、次のように呼び出すことができます(2つの配列$array1$array2):

$merged = array_merge_map_recursive($array1, $array2, $sumIfValue);
于 2012-10-05T05:09:41.397 に答える
0

リソースを節約するには最初にマージアレイを使用します

于 2012-10-05T04:02:51.860 に答える