2014-11-06 2 views
1

I가 다차원 배열 :다중 배열 계수 값

$array = array(
array(
"id" => 1, 
"value" => 100 
), 
array(
"id" => 1, 
"value" => 200 
), 
array(
"id" => 1, 
"value" => 300 
), 
array(
"id" => 2, 
"value" => 2 
), 
array(
"id" => 2, 
"value" => 5 
), 
array(
"id" => 3, 
"value" => 10.50 
), 
); 
나는이 같은 새로운 다차원 배열을 얻을 필요가

: 내 말은

$newArray = array(
array(
"id" => "1", 
"sum_of_values" => 600 
), 
array(
"id" => 2, 
"sum_of_values" => 7 
), 
array(
"id" => 3, 
"sum_of_values" => 10.50 
), 
); 

를, 키 [ sum_of_values]는 동일한 키 [id]를 가진 하위 배열의 값을 계산해야합니다.

$cnt = count($array); 

      $finalArray = array(); 
      $tempArray = array(); 
      for($i = 0; $i < $cnt; $i++){ 
       if($array[$i]["id"] == $array[$i++]["id"]){ 

        $search = $array[$i]["id"]; 
        $column = "value"; 

        $sum = array_sum(
            array_map(
             function($data) use ($column) { 
              return $data[$column]; 
             }, 
            array_filter(
             $array, 
             function($data) use ($search) { 
              return fnmatch($search, $data["id"]); 
             } 
            ) 
            ) 
        ); 

        $tempArray = array(
         "id" => $array[$i]["id"], 
         "sum_of_values" => $sum 
         ); 

        $finalArray[] = $tempArray; 

        } else { 
         $tempArray = array(
          "id" => $array[$i]["id"], 
          "sum_of_values" => $array[$i]["value"] 
          ); 
         } 
      } 

을 그리고 그것은 같은 [ID]와 하위 배열의 값을 계산, 작동 :

나는 이것을 시도했습니다. 하지만 문제는 하위 배열을 반환하지 않는데, 키 [id]에는 동일한 예제가 없습니다. 내 경우에는 [id] = 3 인 하위 배열이 반환되지 않습니다. 또한 [id] = 1 및 [id] = 2 인 하위 배열은 [n-n/2] 번 반복됩니다.

나는이 문제가 바보 같이 보이기 때문에 for ($i = 0; $i < $cnt; $i++)주기와 조건 if ($array[$i]["id"] == $array[$i++]["id"])을 사용하고 있다고 생각하지만 다른 것을 찾을 수 없습니다.

답변

3

귀하의 기능이 너무 복잡해 보입니다. 이건 어때?

$result = array(); 
foreach ($array as $item) { 
    if (!empty($result[$item['id']])) 
     $result[$item['id']]['sum_of_values'] += $item['value']; 
    else 
     $result[$item['id']] = array(
      'id' => $item['id'], 
      'sum_of_values' => $item['value'] 
     ); 
} 

경우 당신이 얻을 print_r($result) :

Array 
(
    [1] => Array 
     (
      [id] => 1 
      [sum_of_values] => 600 
     ) 

    [2] => Array 
     (
      [id] => 2 
      [sum_of_values] => 7 
     ) 

    [3] => Array 
     (
      [id] => 3 
      [sum_of_values] => 10.5 
     ) 

) 
+0

이것은 정확히 내가 필요한 것입니다! 도와 주셔서 감사합니다. 미래를 위해이 예를 분석 할 필요가있다. –

1

단지의 대안으로 :이 array_reduce()에 대한 시터이다 : 나는 일반적인 루프에 접근의이 종류를 선호

$totals = array_reduce($array, function($reduction, $current){ 
    $id = $current["id"]; 
    if (empty($reduction[$id])){ 
     $reduction[$id] = ["id"=>$id, "sum_of_values"=>0]; 
    } 
    $reduction[$id]["sum_of_values"] += $current["value"]; 
    return $reduction; 
}, []); 

가/처리 : 나는 조금 더 깨끗하다고 ​​생각한다. 그러나 마일리지는 분명히 다릅니다.