2017-10-02 10 views
0

I의 구조 만 값이 같은 다른 정확히 같은 두 개의 어레이가 ..두 개의 다차원 배열 중에서 가장 높은 수를 얻으려면 어떻게해야합니까?

// $array1 
Array 
(
    [Backlight] => Array 
    (
     [Supply_Type] => Backlight 
     [Value] => 100.00 
     [Count] => 2 
    ) 

    [Body Glass] => Array 
    (
     [Supply_Type] => Body Glass 
     [Value] => 100.00 
     [Count] => 82 
    ) 
) 

// $array2 
Array 
(
    [Backlight] => Array 
    (
     [Supply_Type] => Backlight 
     [Value] => 200.00 
     [Count] => 1 
    ) 

    [Body Glass] => Array 
    (
     [Supply_Type] => Body Glass 
     [Value] => 150.00 
     [Count] => 90 
    ) 
) 

목표 "개수", "값"중 가장 높은 값에서 모두 하나 개의 어레이를 생성한다 각 유형별 (Body Glass, Backlight).

그래서

은 다음과 같아야합니다 ...

// $finalArray 
Array 
(
    [Backlight] => Array 
    (
     [Supply_Type] => Backlight 
     [Value] => 200.00 
     [Count] => 2 
    ) 

    [Body Glass] => Array 
    (
     [Supply_Type] => Body Glass 
     [Value] => 150.00 
     [Count] => 90 
    ) 
) 

내가 array_uintersect이 작업을 수행하지만, 지금까지 내가 알고 있어요으로 시행 착오를 통해 할 수 생각 두 개 이상의 배열이있을 수 있습니다으로 , 이것은 한 배열의 값만 반환하고 나머지는 비교합니다. 그리고 잘못된 경로로 내려갈 수도 있습니다.

나는 이것을 추가 할 것이라고 생각했습니다. array_reduce를 사용하여, 나는 배열에 두 개의 값 ("값"과 "수")에서 값을 추가 할 필요로 할 때

이 문제는 ... 난 그냥 쓰고 싶다 이상적으로 시작

 $sum = array_reduce($array, function ($a, $b) use($key) { 
      isset($a[$b[$key]]) ? $a[$b[$key]]["Value"] += $b["Value"] : $a[$b[$key]] = $b; 
      isset($a[$b[$key]]) ? $a[$b[$key]]["Count"] += $b["Count"] : $a[$b[$key]] = $b; 
      return $a; 
     }); 

하지만 두 번째 할당이 올바르게 추가되지 않았습니다. 제대로 기억한다면 첫 번째 배열 값을 두 번 더 추가했습니다.

그래서 ... 두 개 이상의 배열을 생성하는이에 대한

foreach($values as $value) { 

     $sum[] = array_reduce($array, function ($a, $b) use($key, $value) { 
      isset($a[$b[$key]]) ? $a[$b[$key]][$value] += $b[$value] : $a[$b[$key]] = $b; 
      return $a; 
     }); 
    } 

정착 그리고이 현재의 문제에 저를 제공합니다.

+0

데이터베이스를 사용하고 있습니까? 그렇다면 거기에 그것을한다면, 그렇지 않다면 당신은 데이터베이스를 사용해야합니다. –

+1

그냥 배열에 루프를 사용하고 다른 것들과 비교하기 전에 differents 값을 잡아서 최대 결과 배열을 만드십시오. – YaatSuka

+0

"Backlight"와 "Body Glass"속성을 가진 연관 배열이 가득 찬 배열을 가지고 있다는 것을 정말로 말하고 싶습니까? 아니면 개별 배열을 가지고 있습니까? – PHPglue

답변

0

당신 그래서 당신이 배열의 알 수없는 번호를이

$key_array = array(
    [0] => 'Backlight' 
    [1] => 'Body Glass' 
) 
$final_array = []; 
//than loop for key_array 
foreach($key_array as $key=>$value){ 
    //check condition if array1 count bigger than push array1 otherwise push array2 object 
    if($array1[$value]['Count'] > $array2[$value]['Count']){ 
     $temp_array = $array1[$value]; 
     if($array1[$value]['Value'] < $array2[$value]['Value']){ 
      $temp_array['Value'] = $array2[$value]['Value']; 
     } 
     array_push($final_array,$temp_array); 

    }else{ 
     $temp_array = $array2[$value]; 
     if($array1[$value]['Value'] > $array2[$value]['Value']){ 
      $temp_array['Value'] = $array1[$value]['Value']; 
     } 
     array_push($final_array,$temp_array); 
    } 
} 

코드와 같은 배열을 얻을 array_keys 를 사용하여 단일 배열의 모든 키를 얻을 - 첫위한 하나 개의 간단한 제안이

$key_array = array_keys($array1); 
$final_array = []; 
$total_array = [$array1,$array2,......,$arrayN]; 
$temp_array = $total_array[0]; 
//than loop for key_array 
foreach($key_array as $key=>$value){ 

    foreach ($total_array as $key=>$valueArr) { 
     if($key != 0){ 
      // check condition if array1 count bigger than push array1 otherwise push array2 object 
      if($valueArr[$value]['Count'] > $temp_array[$value]['Count']){ 
       $temp_array = $valueArr[$value]; 
       if($valueArr[$value]['Value'] < $temp_array[$value]['Value']){ 
        $temp_array['Value'] = $temp_array[$value]['Value']; 
       } 
      }else{ 
       $temp_array = $temp_array[$value]; 
       if($valueArr[$value]['Value'] > $temp_array[$value]['Value']){ 
        $temp_array['Value'] = $valueArr[$value]['Value']; 
       } 
      } 
     }    
    } 

    array_push($final_array,$temp_array); 
} 
+0

나는 내 대답을 업데이트 해주세요. –

+0

도움이 더 필요하면 알려주세요. –

+0

어떻게 알 수없는 양의 배열이 작동합니까, 표준 PHP 함수를 사용하여 간단한 방법이 있었으면 좋겠지 만 보이지는 않습니다. –

0
private function summary($array, $key, $values = array()) { 

    foreach($values as $value) { 
     $sum[] = array_reduce($array, function ($a, $b) use($key, $value) { 
      isset($a[$b[$key]]) ? $a[$b[$key]][$value] += $b[$value] : $a[$b[$key]] = $b; 
      return $a; 
     }); 
    } 

    $finalSum = $sum[0]; 

    // sort into arrays... 
    $sortArr = array(); 

    foreach($sum as $sumArr) { 
     foreach($sumArr as $type => $typeArr) { 
      foreach($typeArr as $k => $v) { 
       if(in_array($k, $values)) { 
        $sortArr[$type][$k][] = $v; 
       } 
      } 
     } 
    } 

    // replace original array with highest values 
    foreach($sortArr as $type => $fieldArr) { 
     foreach($fieldArr as $fieldKey => $field) { 
      $finalSum[$type][$fieldKey] = max($sortArr[$type][$fieldKey]); 
     } 
    } 

    return $finalSum; 
}