2008-10-24 7 views
1

다차원 배열의 값에 가중치를 곱하고 결과를 PHP 또는 일반적으로 새 배열로 합계하는 방법은 무엇입니까?PHP에서 가중치 배열을 어떻게 요약합니까?

보링 방법은 다음과 같습니다

$weights = array(0.25, 0.4, 0.2, 0.15); 
$values = array 
      ( 
      array(5,10,15), 
      array(20,25,30), 
      array(35,40,45), 
      array(50,55,60) 
      ); 
$result = array(); 

for($i = 0; $i < count($values[0]); ++$i) { 
    $result[$i] = 0; 
    foreach($weights as $index => $thisWeight) 
    $result[$i] += $thisWeight * $values[$index][$i]; 
} 

더 우아한 해결책이 있습니까?

+0

다른 답변은 어디로 갔습니까? –

답변

1

물론 우아함에 따라 다릅니다.

function weigh(&$vals, $key, $weights) { 
    $sum = 0; 
    foreach($vals as $v) 
     $sum += $v*$weights[$key]; 
    $vals = $sum; 
} 

$result = $values; 
array_walk($result, "weigh", $weights); 

편집 : 예를 더 잘 읽지 않아서 죄송합니다. array_walk가 참조로 작동하기 때문에 result의 복사본을 만듭니다.

+0

이것은 그가 요구하는 것이 아닙니다. –

+0

마지막 array_sum을 제거하는 것입니다. 내가 할께. – gnud

+0

네 말이 맞아. 죄송합니다. 여기있어 :/ – gnud

0

흠 ...

foreach($values as $index => $ary) 
    $result[$index] = array_sum($ary) * $weights[$index]; 
+0

나는 내 질문에 대해 잘 이해하지 못했다고 생각합니다. 나는 모든 합계의 합이 아닌 가중 합계로 끝나기를 원합니다. 즉, $ result는 차원 1xcount ($ values ​​[0])입니다. –

0

은 또한 처음에 질문을 오해했다.

나는 그 데이터 표현으로 다른 선택이 당신이 가지고있는 것보다 덜 분명하다고 생각합니다.

우리가 그것을 다른 것으로 바꿀 수 있다면, 예를 들어 우리가 행렬을 조 변경하고 다른 방법으로 곱하면, 더욱 숙취되고 아마도 우아한 방법을 얻는 것이 매우 쉬울 것입니다.

<?php 

$weights = array(0.2,0.3,0.4,0.5); 
$values = array(array(1,2,0.5), array(1,1,1), array(1,1,1), array(1,1,1)); 
$result = array(); 

for($i = 0; $i < count($values[0]); ++$i) { 
     $result[$i] = 0; 
     foreach($weights as $index => $thisWeight) { 
      $result[$i] += $thisWeight * $values[$index][$i]; 
     } 
} 
print_r($result); 


$result = call_user_func_array("array_map",array_merge(array("weightedSum"),$values)); 

function weightedSum() { 
    global $weights; 
    $args = func_get_args(); 
    return array_sum(array_map("weight",$weights,$args)); 
} 

function weight($w,$a) { 
    return $w*$a; 
} 

print_r($result); 

?>