0

array_replace_recursive2番目の配列から新しい値を作成せずに何をするかを実行する関数を見つけることができません。

基本的に、建設的な目的で空の値を持つこの配列があります。$_POST次に、同じキーを持つデータをコピーします。しかし、外部キーの値をコピーしたくありません。

$array = array(
  'one' => '',
  'two' => array(
    'this' => '',
    'that' => '',
  ),
  // ...
);

$_POST = array(
  'one' => 'a',
  'two' => array(
    'this' => 'b',
    'that' => 'c',
    'dontcopyme' => '...',
  ),
  'dontcopyme' => 'x',
  // ...
);

//$new_array = array_merge_recursive($array, $_POST);
//$new_array = array_replace_reursive($array, $_POST);
$new_array = array_dosomemagic($array, $_POST);

この実証的なケースで私が求めている結果は次のとおりです。

array(
  'one' => 'a'
  'two' => array(
    'this' => 'b'
    'that' => 'c'
  )
)

print_r($new_array);

注:多次元配列

4

2 に答える 2

0

申し訳ありませんが、これはセクシーなワンライナーではありませんが、再帰を 1 行に詰め込むのはかなり困難です。

私の方法にはisset()、アクセスを試みる前に配列要素が存在することを確認するためのいくつかの重要なチェックが含まれています。私の関数では、警告/通知は表示されません。

コード: (デモ)

function recursivePopulate($defaults,$post){
    foreach($defaults as $key=>&$elem){  // make $elem modifiable by reference
        if(!is_array($elem) && isset($post[$key])){  // if not an array and matching element in $_POST
            $elem=$post[$key];  // store $post 
        }elseif(isset($post[$key])){  // only recurse subarray if exists in BOTH arrays
            $elem=recursivePopulate($elem,$post[$key]); // recurse using subarray
        }
    }
    return $defaults;
}

$defaults=[
    'one'=>'one',
    'two'=>[
        'this'=>'this',
        'that'=>'that',
            ['deep'=>'no match']
    ]
];

$_POST=[
  'one'=>'New One',
  'two'=>[
    'this'=>'New This',
    'that'=>'New That',
    'dontcopyme'=>'...'
  ],
  'dontcopyme' => 'X'
];

var_export(recursivePopulate($defaults,$_POST));

出力:

array (
  'one' => 'New One',
  'two' => 
  array (
    'this' => 'New This',
    'that' => 'New That',
    0 => 
    array (
      'deep' => 'no match',
    ),
  ),
)
于 2017-09-08T09:40:34.183 に答える