4

過去にこういう質問が多かったと思いますので、よろしければ申し訳ありません。基本的に、重複するキーに対して2つのキーを作成せずに、2つの多次元配列をマージしようとしています。

次に例を示します。

$one = array(
    'foo' => array(
        'bar' => array(
            'hello' => 'world',
            'boom'  => 'universe'
        ),
        'whiz' => array(
            'wham' => array(
                'blam' => 'kaplow'
            )
        )
    )
);

$two = array(
    'foo' => array(
        'whiz' => 'woo',
        'king' => array(
            'kong' => 'animal'
        )
    )
);

使用するarray_merge_recursive($one, $two);と、次の結果が得られます。

array(1) {
  ["foo"]=>
  array(3) {
    ["bar"]=>
    array(2) {
      ["hello"]=>
      string(5) "world"
      ["boom"]=>
      string(8) "universe"
    }
    ["whiz"]=>
    array(2) {
      ["wham"]=>
      array(1) {
        ["blam"]=>
        string(6) "kaplow"
      }
      // This is the problem.
      [0]=>
      string(3) "woo"
    }
    ["king"]=>
    array(1) {
      ["kong"]=>
      string(6) "animal"
    }
  }
}

使用するarray_merge($one, $two);と、次の結果が得られます。

array(1) {
  ["foo"]=>
  array(2) {
    // This is good but the rest of the array is gone.
    ["whiz"]=>
    string(3) "woo"
    ["king"]=>
    array(1) {
      ["kong"]=>
      string(6) "animal"
    }
  }
}

これが私が求めている出力です:

array(1) {
  ["foo"]=>
  array(3) {
    ["bar"]=>
    array(2) {
      ["hello"]=>
      string(5) "world"
      ["boom"]=>
      string(8) "universe"
    }
    // Key is replaced, rest of the array remains intact.
    ["whiz"]=>
    string(3) "woo"
    ["king"]=>
    array(1) {
      ["kong"]=>
      string(6) "animal"
    }
  }
}

だから基本的に、私はの機能をarray_merge_recursive()求めていますが、それが次のように機能するためにarray_replace_recursive()、皆さんは何かアイデアがありますか?

-

私は今のところ答えを受け入れましたが、他のおそらくより良い方法を示すことに落胆しないでください、私はもう一度チェックします。

みんなありがとう。

4

1 に答える 1

2

私はあなたが探していると思います:

function farray_merge_recursive() {

    if (func_num_args() < 2) {
        trigger_error(__FUNCTION__ .' needs two or more array arguments', E_USER_WARNING);
        return;
    }
    $arrays = func_get_args();
    $merged = array();

    while ($arrays) {
        $array = array_shift($arrays);
        if (!is_array($array)) {
            trigger_error(__FUNCTION__ .' encountered a non array argument', E_USER_WARNING);
            return;
        }
        if (!$array)
            continue;
        foreach ($array as $key => $value)
            if (is_string($key))
                if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key]))
                    $merged[$key] = call_user_func(__FUNCTION__, $merged[$key], $value);
                else
                    $merged[$key] = $value;
            else
                $merged[] = $value;
    }
    return $merged;
}

自分で書きたくなかったPHPマニュアルcosから盗んだと思います。

MVCフレームワークの構成配列を組み合わせて上書きするために使用しますが、うまく機能します。

于 2012-07-19T13:17:19.807 に答える