2012-01-17 2 views
1

내 다차원 배열의 모든 배열에 요소를 추가하고 싶습니다.PHP에서 mutidimentional 배열의 모든 배열에 요소를 추가하는 가장 좋은 방법

내 배열은 다음과 같이이다 :

내가 두 배열에 [RatingID] => 2를 추가 할
Array 
(
    [0] => Array 
     (
      [RatingFactorPreferenceID] => 10 
      [PreferenceID] => 45 
      [RatedValue] => 1 
      [CreatedOn] => 1326779061 
      [CreatedBy] => 25 
     ) 

    [1] => Array 
     (
      [RatingFactorPreferenceID] => 20 
      [PreferenceID] => 45 
      [RatedValue] => 2 
      [CreatedOn] => 1326779061 
      [CreatedBy] => 25 
     ) 

) 

, 다음 내 최종 배열과 같습니다

내 배열을 통해 내가 루프 수
Array 
(
    [0] => Array 
     (
      [RatingID] => 2 
      [RatingFactorPreferenceID] => 10 
      [PreferenceID] => 45 
      [RatedValue] => 1 
      [CreatedOn] => 1326779061 
      [CreatedBy] => 25 
     ) 

    [1] => Array 
     (
      [RatingID] => 2 
      [RatingFactorPreferenceID] => 20 
      [PreferenceID] => 45 
      [RatedValue] => 2 
      [CreatedOn] => 1326779061 
      [CreatedBy] => 25 
     ) 

) 

및 이렇게 , 이것을 할 수있는 더 좋은 방법이 있습니까?

+1

이러한 데이터는 SQL 문에서 제공됩니까? 어쩌면 당신은 PHP 대신 쿼리 수준에서 할 수 –

+0

@andreas 아니 PHP 배열 –

답변

2
$array = array_map(function ($a) { return $a + array('RatingID' => 2); }, $array); 

이렇게하면 원하는대로 장면이 반복됩니다.
array_walk을 사용할 수도 있습니다.하지만 이는 실제로 다른 구문으로 위장되어 반복됩니다.

+0

실제로 2 하드 코딩 된 값이 아닙니다. 내가 $ var = 1을 사용하려고했을 때; 및 배열 ('RatingID'=> $ var)을 arry_map 함수 내에 저장합니다. 그것은 정의되지 않은 변수 $ var라고 말합니다. 이유는 무엇입니까 –

+1

익명 함수 외부의 변수는 함수 내에서 범위 내에 있지 않기 때문입니다. 범위에 그것들을 포함하려면'function ($ a) use ($ var) {...}'를 사용해야합니다. http://www.php.net/manual/en/functions.anonymous.php를 참조하십시오. 이 구문에 익숙하지 않다면 간단한 루프가 더 나은 선택 일 것입니다. – deceze

1

@ deceze의 답변은 좋지만 두 번째 배열을 인스턴스화하고 배열 조합 연산자 (+)를 사용하는 것은 불필요하게 복잡합니다. 간단하게 :

$new_array = array_map(
    function($inner_array) { 
    $inner_array[ 'RatingID' ] = 2; 

    return $inner_array; 
    }, 

    $orig_array 
); 
+1

"불필요하게 복잡한"을 정의하는 방법에 따라 다릅니다. 나는 하나의 표현이 "불필요하게 복잡하다"는 두 문장으로 이루어진 것을 발견한다. 만약 당신이 그렇게까지 나아가면, 7 행의'array_map' 대신에 3 행의'foreach'를 사용하십시오 : o) – deceze

+0

이것은 php5.3 + right입니까? –

+0

@deceze 가독성과 계산 측면에서 "복잡한". 다음 녀석만큼 좋은 라이너를 좋아하지만 새 배열을 할당 한 다음 개행을 저장하기 위해 병합을 수행하는 것은 허영입니다. –

0

내가 array_walk이 당신을 위해 작동해야 최선의 선택

$array = array(
      array(
       'RatingFactorPreferenceID' => 10, 
       'PreferenceID' => 45, 
       'RatedValue' => 1, 
       'CreatedOn' => 1326779061, 
       'CreatedBy' => 25 
      ), 
      array(
       'RatingFactorPreferenceID' => 20, 
       'PreferenceID' => 45, 
       'RatedValue' => 2, 
       'CreatedOn' => 1326779061, 
       'CreatedBy' => 25, 
      ) 
     ); 

function AddAtTop(&$act_array,$key){ 

    $act_array = array_merge(array('RatingID'=>2), $act_array); 
} 

array_walk($array, 'AddAtTop'); 

echo '<pre>'; 
print_r($array); 
echo '</pre>'; 

생각합니다.

관련 문제