Я пытаюсь объединить числа в массив, добавляя их так, чтобы максимальное значение могло быть только на 30.
Например, это мой массив:
array(10,30,10,10,15);
После объединения чисел в массиве с элементами с максимальным значением 30 результат должен быть:
array(30,30,15);
Как этого добиться?
я думаю, что этот вопрос нуждается в уточнении. Вы ищете способ взять массив чисел, а затем объединить их, получив сумму всех чисел в массиве и создав новый массив, который будет заполнен значениями, которые складываются (сумма) с тем же значением, что и исходный массив, но значение не выше 30?
$total = array_sum(array(10,30,10,10,15)); //assign sum totals from orignal array
$maxValue = 30; //assign max value allowed in array
$numberOfWholeOccurancesOfMaxValue = floor($total/$maxValue);
$remainder = $total%$maxValue;
//build array
$i=0;
while ( $i < $numberOfWholeOccurancesOfMaxValue ){
$array[] = $maxValue;
$i++;
}
$array[] = $remainder;
print_r($array);
Проверьте свой ответ на прецедент
@quickSwap я ответил на ваш основной пост
I'm trying to combine numbers in an array by adding them so that the max value can only by 30
Итак, когда вы комбинируете числа, вы можете достичь минимально возможного набора значений в своем массиве, а также убедиться, что максимальное значение остается равным 30:
Код:
<?php
$arr = array(10,30,10,10,15);
sort($arr);
$res = [];
$curr_sum = 0;
foreach($arr as $each_value){
if ($curr_sum + $each_value <= 30) $curr_sum += $each_value;
else{
$res[] = $curr_sum;
$curr_sum = $each_value;
}
}
$res[] = $curr_sum;
print_r($res);
Обновлять: Если порядок чисел имеет значение, вы можете просто использовать rsort(), чтобы отобразить их в порядке убывания.
rsort($res);
вам нужно отсортировать массив по размеру значения, так как это выводит массив ([0] => 30 [1] => 15 [2] => 30), когда оператор запрашивает массив ([0] => 30 [1] => 30 [2] => 15 ) .
@Клинт Я не думаю, что порядок имеет значение. ОП никогда не упоминал об этом. Я добавил обновление. Если это имеет значение для OP.
проверить это с помощью массива (110,30,10,10,5,6,7,13,50,15), кажется, дает массив ([0] => 28, [1] => 23, [2] => 15 , [3] => 30, [4] => 50, [5] => 110 )
@Clint Тестовый пример не имеет смысла! 110
сама выше 30
. Как вы могли ожидать, что это будет сочетаться или существовать по отдельности, не нарушая правила? OP никогда не говорил, что вы также можете исключить значения из массива.
Вы можете зациклиться только один раз, чтобы получить это,
$temp = array(10,30,10,10,15);
natsort($temp); // sorting to reduce hustle and complication
$result = [];
$i = 0;
$maxValue = 30;
foreach($temp as $v){
// checking sum is greater or value is greater or $v is greater than equal to
if (!empty($result[$i]) && (($result[$i]+$v) > $maxValue)){
$i++;
}
$result[$i] = (!empty($result[$i]) ? ($result[$i]+$v) : $v);
}
print_r($result);
это дает выходной массив ( [0] => 20 [1] => 25 [2] => 30 ), что не то, что хочет оператор.
Я обновил свой ответ. И да, порядок не помешает ОП. так что нам лучше держать этот путь.
тестирование с массивом array(10,30,10, 70, 30, 1,1,3,6 ,10,15); GiveArray ([0] => 21, [1] => 20, [2] => 15, [3] => 30, [4] => 30, [5] => 70)
Я уверен, что никто не знает, какой формат требуется для вывода, кроме OP. Значит, у вас тоже не так. Отсюда и его неопределенность.
насколько я понимаю, оператор ищет массив со всеми сложенными значениями, но не значение больше 30? так Массив ([0] => 30, [1] => 30, [2] => 30, [3] => 30, [4] => 30, [5] => 30, [6] => 6 )
Да, но неясно, хочет ли ОП округлить до 30.
Привет, да, я сомневаюсь в себе сейчас. я попросил ОП уточнить
Пожалуйста, предоставьте код, чтобы показать, что вы пытались.