У меня есть два массива структура точно так же, только значения разные, как это ..
// $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
)
)
Цель состоит в том, чтобы создать один массив из обоих с максимальным значением «Value» и «Count» для каждого типа (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, мне нужно было сложить значения из двух значений («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;
});
}
И также подводит меня к этой текущей проблеме.
У меня есть одно простое предложение для вас
-Первый получить все ключи в одном массиве, используя 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);
}
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;
}