2017-09-26 5 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()'에있는 주어진 대체 데이터에서'array '(array) (0 => '99')를 제거하면 배열이 생성되고 나머지 키들은 남겨 둡니다. 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

관련 문제