Сумма значений массива по значению ключа php - PullRequest
0 голосов
/ 22 сентября 2019

Как проверить столбчатые значения по ассоциативному ключу?

Я хочу проверить данные по "building_id".Здесь у меня есть 2 здания, тогда я хочу арендовать данные как сумму с группой по "tenancy_rate"

Массив ввода:

Array
(
[0] => Array
    (
        [id] => 34
        [building_id] => 786
        [tenancy_rate] => 0
        [rent_per_room] => 10000
        [management_fee_per_room] => 0
    )

[1] => Array
    (
        [id] => 35
        [building_id] => 786
        [tenancy_rate] => 10
        [rent_per_room] => 11810
        [management_fee_per_room] => 5400
        [rent] => 86050
    )

[2] => Array
    (
        [id] => 36
        [building_id] => 786
        [tenancy_rate] => 20
        [rent_per_room] => 11810
        [management_fee_per_room] => 5400
        [rent] => 86050
    )
[3] => Array
    (
        [id] => 56
        [building_id] => 798
        [tenancy_rate] => 0
        [rent_per_room] => 10000
        [management_fee_per_room] => 5400
        [rent] => 77000
    )

[4] => Array
    (
        [id] => 57
        [building_id] => 798
        [tenancy_rate] => 10
        [rent_per_room] => 11810
        [management_fee_per_room] => 5400
        [rent] => 86050
    )

[5] => Array
    (
        [id] => 58
        [building_id] => 798
        [tenancy_rate] => 20
        [rent_per_room] => 11810
        [management_fee_per_room] => 5400
        [rent] => 86050
    )

)

Желаемый результат:

Array
(
[0] => Array
    (
        [tenancy_rate] => 0
        [rent] => 77000
    )

[1] => Array
    (
        [tenancy_rate] => 10
        [rent] => 172100
    )

[2] => Array
    (
        [tenancy_rate] => 20
        [rent] => 172100
    )

)

Для этого я попробовал код PHP

Но не получил никакого решения

$sumArray = array();

foreach ($myArray as $k=>$subArray) {
  foreach ($subArray as $id=>$value) {
    $sumArray[$id]+=$value;
  }
}

print_r($sumArray);

Ответы [ 5 ]

2 голосов
/ 22 сентября 2019

Вот фрагмент.Чтобы получить желаемый результат, вам нужно сгруппировать по tenancy_rate, а не по идентификатору здания,

$result = [];
foreach ($arr as $val) {
    // as I see, rent for some array not there, so setting it to 0
    $val['rent'] = ($val['rent'] ?? 0);
    if (isset($result[$val['tenancy_rate']]['rent'])) {
        $result[$val['tenancy_rate']]['rent'] += $val['rent'];
    } else {
        $result[$val['tenancy_rate']] = [
            'tenancy_rate' => $val['tenancy_rate'], 'rent' => $val['rent']];
    }
}
print_r($result);

Демо

Вывод: -

Array
(
    [0] => Array
        (
            [tenancy_rate] => 0
            [rent] => 77000
        )

    [1] => Array
        (
            [tenancy_rate] => 10
            [rent] => 172100
        )

    [2] => Array
        (
            [tenancy_rate] => 20
            [rent] => 172100
        )

)
1 голос
/ 22 сентября 2019

Использование функции для возврата необходимых значений (стоимость и арендная плата) и накопление значений в массиве sumArray, при этом предполагается, что ключи массива результатов связаны с tenancy_rate (это позволяет вставлять дополнительные tenancy_rates).

$sumArray = [];

function processBuildingInfo($building)
{
    return [ $building['tenancy_rate']??0, $building['rent']??0 ];
}

foreach ($myArray as $k=>$subArray) {
    list($rate, $rent) = processBuildingInfo($subArray);
    $sumArray[$rate/10] = [
        'tenancy_rate' => $rate,
        'rent' => $sumArray[$rate/10]['rent'] + $rent
    ];
}

print_r($sumArray);
1 голос
/ 22 сентября 2019

Сначала вам нужно использовать расчетную сумму арендной платы для каждой ставки аренды:

$rentSums = [];
foreach ($input as $info) {
    $tenancyRate = $info['tenancy_rate'] ?? 0;
    $rent = $info['rent'] ?? 0;
    $rentSum = $rentSums[$tenancyRate] ?? 0;
    $rentSums[$tenancyRate] = $rentSum + $rent;
}

Затем вы можете построить результат, используя данные предыдущего шага:

$result = [];
foreach ($rentSums as $tenancyRate => $rentSum) {
    $result[] = [
        'tenancy_rate' => $tenancyRate,
        'rent' => $rentSum,
    ];
}
1 голос
/ 22 сентября 2019

Вы можете использовать foreach и группировать по индексу tenancy_rate

$f = [];
foreach($a as $v){
  if(!empty($f[$v['tenancy_rate']])){
    $f[$v['tenancy_rate']]['rent'] += $v['rent'];
  }else{
    $f[$v['tenancy_rate']] = [
            'tenancy_rate' => $v['tenancy_rate'],
            'rent'         => isset($v['rent']) ? $v['rent'] : 0
        ];
  }
}

Рабочий пример: - https://3v4l.org/nWRGA

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

0 голосов
/ 22 сентября 2019

используйте этот цикл:

foreach ($myArray as $k=>$subArray) {
  foreach ($subArray as $id=>$valueArray) {
    $sumArray[$id]+=[
       'tenancy_rate' => $valueArray['tenancy_rate'],
       'rent' =>  $valueArray['rent']
    ];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...