0

2 つの多次元配列を追加しようとしています。この関数は、次のように配列を一緒に追加するのとまったく同じである必要があります: $new_array = $array1 + $array2, ただし、多次元配列で機能する必要があります。これは、$array2 が既存のキー値を上書きしてはならないことを意味します。

例: 次の $default_array があるとします。

array
  'something' => int 0
  'nested' => 
    array (size=3)
      'a' => null
      'b' => null
      'c' => null

そして、次の $user_array:

array
  'something' => int 1000
  'nested' => 
    array (size=3)
      'a' => 1
  'new' => int 4

2 つを一緒に追加すると ($user_array + $default_array のように)、次のようになります。

array (size=4)
      'something' => int 1000
      'nested' => 
        array (size=3)
          'a' => 1
          'b' => null
          'c' => null
      'new' => int 4

現在、2 つの多次元配列を追加すると、上書き機能は配列の最初の次元にのみ適用されるようです。これは、この場合、'nested' が $user_array に既に存在するため、他の値を追加しないことを意味します。

編集:これは、無制限の量のディメンションで機能する必要があることにも言及する必要があります。

編集 2: Rain の回答を適用しようとしましたが、意図したとおりに機能しません。まず、「未定義のインデックス」通知が表示されます。第二に、出力は私が望んでいたものではありません。次の配列を検討してください。

        $default = array(
            'a' => array(
                'a' => 'a',
                'b' => 'b',
                'c' => 'c',
                ),
            );

        $user = array(
            'b' => 1,
            'a' => array(
                'b' => 'something',
                'c' => 'something else',
                'd' => 'd',
                ),
            'c' => 2);

Rain の関数で得られる出力は次のとおりです。

array (size=3)
  'a' => 
    array (size=3)
      'a' => string 'a' (length=1)
      'b' => string 'b' (length=1)
      'c' => string 'c' (length=1)
  'b' => int 1
  'c' => int 2

この例では、サブ配列内の 'b' および 'c' キーは、それぞれ 'something' および 'something else' である必要があります。それを修正する方法がよくわかりません。

4

3 に答える 3

1

再帰関数は間違いなくここに行く方法です。私はちょうど次のようにホイップしました。&の関数宣言でのの使用に注意してくださいfill_in_aux。これにより、2 番目の引数 ( と呼ばれる$default) が、値ではなく参照によって渡されます。fill_in実際の「デフォルト」配列が変更されないようにラップされます。

function fill_in($user, $default) {
    fill_in_aux($user, $default);
    return $default;
}

function fill_in_aux($user, &$default) {
    foreach ($user as $key => $value) {
        if (is_array($value)) {
            fill_in_aux($user[$key], $default[$key]);
        } else {
            $default[$key] = $value;
        }
    }
}

これは、配列内のキーが に設定されている場合でも、配列内に設定されているものはすべて$default、配列内に存在するものによって上書きされることを前提としています。この動作を変更するには、 の句に別のステートメントを追加します。$user$usernullifelsefill_in_aux


使用例

あなたの例の配列では、の出力

print_r(fill_in($user_array, $default_array));

Array
(
    [something] => 1000
    [nested] => Array
        (
            [a] => 1
            [b] =>
            [c] =>
        )

    [new] => 4
)

壊す

通常、PHP で関数を呼び出す場合、パラメーターはで渡されます。関数は、渡された変数のコピーを取得します。これは、関数がパラメーターに対して必要なことは何でもできることを意味しますが、関数が返されたときに、渡された元の変数は影響を受けません。

パラメータの前に&シンボルがある場合、パラメータはコピーされるのではなく、参照によって渡されます。関数がパラメーターを変更するとき、実際には渡された変数を直接変更しています。

詳細については、http: //php.net/manual/en/language.references.pass.phpをご覧ください。

于 2013-04-24T23:33:01.237 に答える
1

array_merge_recursive()(array_merge()だけでなく) http://www.php.net/manual/en/function.array-merge-recursive.phpを使用してみることができます

<?php
$defaultarray = array(
'something' => 0,
  'nested' => 
    array (
      'a' => null,
      'b' => null,
      'c' => null));

$newArray = array(
  'something' => 1000, 
  'nested' => 
    array ('a' => 1,
  'new' => 4));

$mergedArray = array_merge_recursive($defaultarray, $newArray);
echo print_r($mergedArray,true);
?>

出力: Array ( [something] => Array ( [0] => 0 [1] => 1000 ) [nested] => Array ( [a] => Array ( [0] => [1] => 1 ) [b] => [c] => [新規] => 4 ) )

于 2013-04-24T23:24:51.803 に答える