Как объединить значения в массив, если максимальное значение может быть только 30?

Я пытаюсь объединить числа в массив, добавляя их так, чтобы максимальное значение могло быть только на 30.

Например, это мой массив:

array(10,30,10,10,15);

После объединения чисел в массиве с элементами с максимальным значением 30 результат должен быть:

array(30,30,15);

Как этого добиться?

Пожалуйста, предоставьте код, чтобы показать, что вы пытались.

Benjamin Breton 29.05.2019 11:23

я думаю, что этот вопрос нуждается в уточнении. Вы ищете способ взять массив чисел, а затем объединить их, получив сумму всех чисел в массиве и создав новый массив, который будет заполнен значениями, которые складываются (сумма) с тем же значением, что и исходный массив, но значение не выше 30?

Clint 29.05.2019 13:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
88
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Проверьте свой ответ на прецедент

Rahul 29.05.2019 12:46
sandbox.onlinephpfunctions.com/code/… - работает?
Clint 29.05.2019 12:58

@quickSwap я ответил на ваш основной пост

Clint 29.05.2019 13:03
Ответ принят как подходящий

I'm trying to combine numbers in an array by adding them so that the max value can only by 30

Итак, когда вы комбинируете числа, вы можете достичь минимально возможного набора значений в своем массиве, а также убедиться, что максимальное значение остается равным 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);

Демо:https://3v4l.org/BYhuE

Обновлять: Если порядок чисел имеет значение, вы можете просто использовать rsort(), чтобы отобразить их в порядке убывания.

rsort($res);

вам нужно отсортировать массив по размеру значения, так как это выводит массив ([0] => 30 [1] => 15 [2] => 30), когда оператор запрашивает массив ([0] => 30 [1] => 30 [2] => 15 ) .

Clint 29.05.2019 12:40

@Клинт Я не думаю, что порядок имеет значение. ОП никогда не упоминал об этом. Я добавил обновление. Если это имеет значение для OP.

nice_dev 29.05.2019 12:47

проверить это с помощью массива (110,30,10,10,5,6,7,13,50,15), кажется, дает массив ([0] => 28, [1] => 23, [2] => 15 , [3] => 30, [4] => 50, [5] => 110 )

Clint 29.05.2019 13:00

@Clint Тестовый пример не имеет смысла! 110 сама выше 30. Как вы могли ожидать, что это будет сочетаться или существовать по отдельности, не нарушая правила? OP никогда не говорил, что вы также можете исключить значения из массива.

nice_dev 29.05.2019 13:08

Вы можете зациклиться только один раз, чтобы получить это,

$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 ), что не то, что хочет оператор.

Clint 29.05.2019 12:39

Я обновил свой ответ. И да, порядок не помешает ОП. так что нам лучше держать этот путь.

Rahul 29.05.2019 12:44

тестирование с массивом 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)

Clint 29.05.2019 13:02

Я уверен, что никто не знает, какой формат требуется для вывода, кроме OP. Значит, у вас тоже не так. Отсюда и его неопределенность.

Rahul 29.05.2019 13:03

насколько я понимаю, оператор ищет массив со всеми сложенными значениями, но не значение больше 30? так Массив ([0] => 30, [1] => 30, [2] => 30, [3] => 30, [4] => 30, [5] => 30, [6] => 6 )

Clint 29.05.2019 13:05

Да, но неясно, хочет ли ОП округлить до 30.

Rahul 29.05.2019 13:06

Привет, да, я сомневаюсь в себе сейчас. я попросил ОП уточнить

Clint 29.05.2019 13:16

Другие вопросы по теме