итерация для l oop для формирования пользовательской таблицы html - PullRequest
0 голосов
/ 01 февраля 2020

Я хочу сформировать пользовательскую таблицу html в php из запроса базы данных. Мой запрос sql:

$query = db_select('taxonomy_term_data','td');
    $query->join('drone','dg','dg.tid = td.tid ');
    $query->fields('td',array('tid','name'));
    $query->fields('dg',array('drone_name'));
    $result=$query->execute()->fetchAll(); 

Данные, возвращаемые запросом, выглядят следующим образом:

Drone Name        Drone Assigned
Huge                DJI
Huge                Parrot
Beginner            Skydio
Beginner            Insitu
Beginner            EHANG
 $drone_table='<br/>
  <table id =  width="40%" cellspacing="5" cellpadding="5" border="1" align="center";">
    <th>Drone Name</th> 
    <th>Drones Assigned</th>';

Я написал оператор для l oop

foreach ($result as $ts){

      $drones_assigned[] = $ts->name;
      $drn_name = $ts->drone_name;      

    $com_arr = implode(",",$drone_assigned);

    $drone_table.='<tr>
    <td>'.$drn_name.'</td>
    <td>'.$com_arr.'</td>
    </tr>';
}

Это не образует таблицу, которую я хочу. t формирует в таблице комбинацию всех назначенных дронов и одного дрона.

Я хочу что-то вроде

Drone Name           Drone Assigned
     Huge                 DJI, Parrot
     Beginner             Skydio,Insitu,EHANG

Но я получаю

Drone Name        Drone Assigned
    Beginner             DJI, Parrot, Skydio,Insitu,EHANG

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Вы можете изменить запрос sql для получения отформатированных результатов, например:

$result = db_query("SELECT  dg.drone_name , GROUP_CONCAT(td.name) FROM taxonomy_term_data td
                        INNER JOIN drone dg ON dg.tid = td.tid GROUP BY dg.drone_name")->fetchAllKeyed();


foreach ($result as $drone_name => $drones_assigned){

    $drone_table.='<tr>
    <td>'.$drone_name.'</td>
    <td>'.$drones_assigned.'</td>
    </tr>';
}

Также вы можете взглянуть на рендеринг таблицы тем с помощью drupal, чтобы легко создать html таблицу https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7.x

1 голос
/ 01 февраля 2020

Хорошо, вот один из способов сделать это, я буду использовать альтернативный синтаксис foreach в коде HTML, потому что лично я считаю, что таким образом он более читабелен.

  1. Сначала мы получили результат запроса к базе данных, который я присвоил массиву PHP:
$results = [
    ['name' => 'Huge', 'assigned' => 'DJI'],
    ['name' => 'Huge', 'assigned' => 'Parrot'],
    ['name' => 'Beginner', 'assigned' => 'Skydio'],
    ['name' => 'Beginner', 'assigned' => 'Insitu'],
    ['name' => 'Beginner', 'assigned' => 'EHANG'],
];
Теперь мы должны получить назначенные дроны для каждого имени дрона , мы будем go с foreach l oop, который сгенерирует массив форма $array['drone_name'] = ['assigned_drones', '.....']:
$drones = [];

foreach ($results as $drone) {
    if (!array_key_exists($drone['name'], $drones)) {
        $drones[$drone['name']] = [];
    }

    $drones[$drone['name']][] = $drone['assigned'];
}
Наконец, мы распечатаем эти значения внутри таблицы HTML, используя foreach l oop (альтернативный синтаксис):
<table border="1">
    <tr>
        <th>Drone Name</th>
        <th>Assigned Drones</th>
        <?php foreach ($drones as $name => $assigned): ?>
            <tr>
                <td><?php echo $name; ?></td>
                <td><?php echo implode(',', $assigned); ?></td>
            </tr>
        <?php endforeach ?>
    </tr>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...