группировка элементов для одного и того же объекта

#php #arrays #object

#php #массивы #объект

Вопрос:

это упрощенный массив объектов с разными элементами (это результат из базы данных). Я пытаюсь сгруппировать классы вместе для каждого пользователя, чтобы я мог показать это в таблице html в качестве конечного результата, я использую это после цикла foreach:

 echo'<td>'.$result->id_person.'</td>';
echo'<td>'.$result->id_class.'</td>';`  
 

Я попытался проанализировать массив с помощью 2 циклов for и цикла if, но это сработало не так, как ожидалось. Пожалуйста, кто-нибудь может мне с этим помочь?

Я хотел бы сгруппировать id_class для одного и того же человека

 Array
(
[0] => stdClass Object
    (
        [id_person] => 1
        [id_class] => 32
        
     )

[1] => stdClass Object
    (
        [id_person] => 5
        [id_class] => 32
     )

[2] => stdClass Object
    (
        [id_person] => 7
        [id_class] => 9
     )

[3] => stdClass Object
    (
        [id_person] => 7
        [id_class] => 40
        
     )
 

Комментарии:

1. Пожалуйста, дайте нам пример вывода, который вы хотите увидеть

2. Массив уже отсортирован id_person ? Я предполагаю, что из ПОРЯДКА ПО запросу?

3. @RiggsFolly да, я использовал ORDER BY, и результат должен быть чем-то вроде [id_class] => 9, 40 но я знаю, что это невозможно, потому что каждый из них представляет собой целый объект

4. Итак, как выглядит код циклов, о которых вы упоминаете?

Ответ №1:

Простая проверка в цикле, как показано ниже, определит, что текущее событие относится к тому же человеку, что и последнее событие.

 $id_person = null;
foreach($results as $result){
    if ( $id_person == $result->id_person ) {
        echo'<td>amp;nbsp;</td><td>'.$result->id_class.'</td>';`  
    } else {
        echo'<td>'.$result->id_person.'</td><td>'.$result->id_class.'</td>';`   
        $id_person = $result->id_person;
    }
}
 

Это должно привести к созданию такой таблицы.

 1   32
5   32
7   9
    40
 

Ответ №2:

С подсказкой RiggsFolly я также использовал $previous, чтобы сохранить предыдущий элемент в текущей итерации и сравнить, совпадает ли он, так что это работает:

 //$res is an array of objects that I'm parsing
$id_person= null;
$tab = [];
$previous = [];
$len = count($res);
for($i = 0, $i<$len, $i  ){
if($id_person== $res[$i]->id_person){
array_push($tab, ($res[$i]->id_class));
}else{
array_push($previous, $res[$i]->id_person);
echo'<tr><td >'.$res[(i-1)]->id_person.'</td><td >'.foreach($tab as $drawTab){ echo $drawTab; }.'</td></tr>'; 
$tab = array();
$tab = $res[$i]->id_class;
}
// check when it's the last element of the array :
if($i == ($len-1)){ ?>
<tr><td> <?php foreach($previous as $pre){echo $pre; } ?> </td>
<td> <?php foreach($array as $arr){echo $arr.'<br/>'; } ?> </td></tr>
<?php
}
}