2017-09-26 13 views
1

配列内の既存のデータを置き換えるのではなく、要求に渡したいデータが配列の最初の値に置き換えられます。誰かが私がここで間違っていることを教えてもらえますか?Laravel Array_Replace_Recursiveを使用すると最初の値のみが置換されます

private function validParams($overrides = []) 
{ 
    return array_replace_recursive([ 
     // More fields, 
     'posts' => [ 
      1 => [ 
       'field1' => ..., 
       'field2' => [], 
       'field3' => [], 
       'field4' => [], 
       'users' => [1, 2], 
       'field6' => ..., 
      ] 
     ], 
    ], $overrides); 
} 

$this->validParams([ 
     'posts' => [ 
      1 => [ 
       'users' => [99], 
      ] 
     ], 
    ])); 

前のコードを実行すると、これになります。

"users" => array:2 [ 
    0 => 99 
    1 => 2 
    ] 

代わりに、必要なもの。

"users" => array:1 [ 
    0 => 99 
    ] 
+0

'$ this-> validParams()'の与えられた置換データから '[] 'を削除すると、配列が作成され、他のキーはそのまま残ります。あなたは99だけを設定したいので、それを使って配列を作成せずにそれを行います; – natheriel

+0

これについての回答を作成することができますので、もっと何を意味するのでしょうか? – user3732216

+0

'array_replace_recursive'は明らかに必要なものではありません。 –

答えて

1

編集されたバージョン:だから

、私は少し周りを演奏し、あなたが必要なものを行うためにカスタム関数を作成しようとしました。私にとってはうまくいくようです。試してみてください。もし私が何かを見逃したら、教えてください。

基本的に、デフォルト配列を関数から削除してから、この基本配列の変数を追加します。これにより、関数は自分自身を呼び出して配列に深く入ることができます。

// removed base 
$base = ['posts' => [ 
    1 => [ 
      'field1' => '', 
      'field2' => [], 
      'field3' => [], 
      'field4' => [], 
      'users' => [1, 2], 
      'field6' => '', 
    ] 
]]; 

// added base param 
function validParams($base, $overrides) { 
    if(is_array($overrides)) { 
     // loop over override 
     foreach($overrides as $key => $overrideVal) { 
      // if override is an array such as base and there is a similar key in the base array, 
      // catch the base value as $baseVal. Then go one step down into base array 
      if (is_array($overrideVal) && (null!==($baseVal = isset($base[$key]) ? $base[$key] : null)) && is_array($baseVal)) { 
       // call self with baseval and override val 
       $base[$key] = validParams($baseVal,$overrideVal); 
      } else { 
       // no longer an array, here we will begin to overwrite 
       // loop trough known last base 
       foreach ($base as $baseKey => $basVal) { 
        // if the value is given in overwrite, then overwrite it 
        if ($baseKey == $key) { 
         $base[$key] = $overrideVal; 
        } else { 
         // was not given in overwrite, remove it 
         unset($base[$baseKey]); 
        } 
       } 
      } 
     } 
    } 
    return $base; 
} 


$result = validParams($base, [ 
     'posts' => [ 
      1 => [users => [99], 
      ], 
     ], 
    ]); 

var_dump($result); 

申し訳ありませんが、申し訳ありませんが、手続き型のスタイルに変更しました。作成が簡単だったためです。

+0

しかし、それは配列ではありません。 – user3732216

+0

@ user3732216ああ、ちょうど気づいた、ダング。 – natheriel

+0

私は必要なPHP配列関数を知っていますか? – user3732216

関連する問題