Добавить все объекты одного типа в массив - PullRequest
0 голосов
/ 09 мая 2019

У меня есть массив объектов, которые я пытаюсь сжать в php.Это мой массив

$proposedStudentFeeCollection = [{"id":1,"student_id":"1","feeType_id":"2","proposed_fee":"5000"},
{"id":2,"student_id":"1","feeType_id":"1","proposed_fee":"5000"},
{"id":3,"student_id":"1","feeType_id":"1","proposed_fee":"2000"},
{"id":4,"student_id":"1","feeType_id":"2","proposed_fee":"15000"},
{"id":5,"student_id":"1","feeType_id":"2","proposed_fee":"5000"},
{"id":6,"student_id":"1","feeType_id":"11","proposed_fee":"9000"},
{"id":7,"student_id":"1","feeType_id":"1","proposed_fee":"20000"},
{"id":8,"student_id":"1","feeType_id":"16","proposed_fee":"1000"}]

Я хочу получить упрощенный массив " new ", который дает мне сумму одинаковых feeType_id примерно так

[{"id":1,"student_id":"1","feetype_id":"1","proposed_fee":"27000"},
{"id":2,"student_id":"1","feetype_id":"2","proposed_fee":"25000"},
{"id":3,"student_id":"1","feetype_id":"11","proposed_fee":"9000"},
{"id":4,"student_id":"1","feetype_id":"16","proposed_fee":"1000"}]

IЯ пытаюсь сделать это так

$myArray = array();
for($i=0; $i<2; $i++){
    $tempObject = $proposedStudentFeeCollection[$i];
    for($j=count($proposedStudentFeeCollection)-1; $j >= 0; $j--) {
        if($tempObject->feetype_id == $proposedStudentFeeCollection[$j]->feetype_id){
            $tempObject->proposed_fee += $proposedStudentFeeCollection[$j]->proposed_fee;
            unset($proposedStudentFeeCollection[$j]);
        }
    }
    $myArray[] = $tempObject;
}
return $myArray;

Но я не получаю ответ.Какой правильный путь?

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Простой foreach - это все, что вам нужно.Вы должны создать элемент для каждого feeType_id, а затем просто сложить все сборы.

$id = 1;
$fees = [];
foreach ($proposedStudentFeeCollection as $data) {
    $feeTypeID = $data->feeType_id;
    if (!isset($fees[$feeTypeID])) {
        $fees[$feeTypeID] = new stdClass;
        $fees[$feeTypeID]->id = $id;
        $fees[$feeTypeID]->proposed_fee = 0;
        $fees[$feeTypeID]->student_id = $data->student_id;
        $fees[$feeTypeID]->feeType_id = $data->feeType_id;
        $id++;
    }

    $fees[$feeTypeID]->proposed_fee += $data->proposed_fee;
}

//$fees = array_values($fees);

Если вы не хотите, чтобы идентификаторы типов сборов использовались в качестве ключей массива, просто используйте array_values для $fees (раскомментируйтепоследняя строка).

Вывод следующий:

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [proposed_fee] => 25000
            [student_id] => 1
            [feeType_id] => 2
        )

    [1] => stdClass Object
        (
            [id] => 2
            [proposed_fee] => 27000
            [student_id] => 1
            [feeType_id] => 1
        )

    [2] => stdClass Object
        (
            [id] => 3
            [proposed_fee] => 9000
            [student_id] => 1
            [feeType_id] => 11
        )

    [3] => stdClass Object
        (
            [id] => 4
            [proposed_fee] => 1000
            [student_id] => 1
            [feeType_id] => 16
        )

)
0 голосов
/ 09 мая 2019

Создайте ассоциативный массив, который использует столбец, по которому вы хотите сгруппировать ключ. Зациклите исходный массив и добавьте строку, если она еще не существует в результате, в противном случае просто добавьте к итогу proposed_fee.

$totals = [];
foreach ($proposedStudentFeeCollection as $e) {
    $id = $e['feeType_id'];
    if (isset($totals[$id])) {
        $totals[$id]['proposed_fee'] += $e['proposed_fee'];
    } else {
        $totals[$id] = $e;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...