0

我有两个数组,结构完全相同,只是值不同,就像这样..

// $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)从“Value”和“Count”中创建一个具有最高值的数组。

所以它应该看起来像这样......

// $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时问题开始了,我需要将数组中两个值(“value”和“count”)的值相加,理想情况下我只想写......

        $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;
        }); 
    }

也让我想到了这个当前的问题。

4

2 回答 2

1
 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;
}
于 2017-10-02T08:03:40.373 回答
0

我有一个简单的建议给你 - 首先使用 array_keys 获取单个数组中的所有键所以你得到这样的数组

$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);
    }
}

未知数量数组的代码

$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);
}
于 2017-10-02T06:12:15.903 回答