如何基于嵌套数组生成HTML表格并实现关联的国家选择表单?
完整实现方案
没问题,我帮你把这个需求拆成几个步骤来实现,既满足从嵌套数组生成HTML表格,又能通过国家筛选表单动态过滤内容。直接上代码和说明:
1. 先填充国家列表($countries数组)
首先咱们得从现有$cars数组里提取不重复的国家,这样表单的选择框才有动态选项,不用手动写死:
<?php $cars = Array( Array("DDT","Detroit","USA", Array( Array("DDT-55555","1x1","100Hp"), Array("DDT-66666","2x2","200Hp"), Array("DDT-77777","3x3","300Hp"), Array("DDT-77777","4x4","400Hp") )), Array( "AMM","London","UK", Array( Array("AMM-888","6x6","500Hp") )), ); // 提取不重复的国家列表到$countries $countries = []; foreach ($cars as $carBrand) { $country = $carBrand[2]; if (!in_array($country, $countries)) { $countries[] = $country; } } ?>
2. 构建国家筛选表单
接下来做带country选择框的表单,提交到当前页面,并且记住用户选择的选项:
<?php // 生成筛选表单 echo '<form method="post" action="' . $_SERVER['PHP_SELF'] . '">'; echo '<div style="margin-bottom:10px;">'; echo '<label for="country">筛选国家:</label>'; echo '<select name="country" id="country" style="padding:4px;">'; // 默认显示"所有国家"选项 echo '<option value="" ' . (isset($_POST['country']) && $_POST['country'] == '' ? 'selected' : '') . '>所有国家</option>'; foreach ($countries as $country) { // 自动选中用户上次提交的国家 $selected = (isset($_POST['country']) && $_POST['country'] == $country) ? 'selected' : ''; echo '<option value="' . htmlspecialchars($country) . '" ' . $selected . '>' . htmlspecialchars($country) . '</option>'; } echo '</select>'; echo '<button type="submit" style="margin-left:8px;padding:4px 12px;">查看</button>'; echo '</div>'; echo '</form>'; ?>
注意:用htmlspecialchars()是为了防止XSS注入,提升安全性;$_SERVER['PHP_SELF']让表单提交到当前页面,不用写死URL。
3. 根据筛选条件生成HTML表格
最后处理筛选逻辑,生成带合并单元格的美观表格:
<?php // 处理筛选条件,获取要展示的车辆数据 $filteredCars = $cars; if (isset($_POST['country']) && !empty($_POST['country'])) { $selectedCountry = $_POST['country']; // 过滤出选中国家的品牌数据 $filteredCars = array_filter($cars, function($brand) use ($selectedCountry) { return $brand[2] == $selectedCountry; }); } // 生成HTML表格 echo '<table border="1" cellpadding="8" cellspacing="0" style="border-collapse:collapse;">'; // 表头 echo '<thead>'; echo '<tr style="background-color:#f0f0f0;">'; echo '<th>品牌代码</th><th>城市</th><th>国家</th><th>车型编号</th><th>驱动类型</th><th>马力</th>'; echo '</tr>'; echo '</thead>'; // 表体 echo '<tbody>'; foreach ($filteredCars as $carBrand) { $brandCode = $carBrand[0]; $city = $carBrand[1]; $country = $carBrand[2]; $models = $carBrand[3]; $modelCount = count($models); $modelIndex = 0; foreach ($models as $model) { echo '<tr>'; // 品牌、城市、国家单元格合并,只在第一个车型行显示 if ($modelIndex === 0) { echo '<td rowspan="' . $modelCount . '">' . htmlspecialchars($brandCode) . '</td>'; echo '<td rowspan="' . $modelCount . '">' . htmlspecialchars($city) . '</td>'; echo '<td rowspan="' . $modelCount . '">' . htmlspecialchars($country) . '</td>'; } echo '<td>' . htmlspecialchars($model[0]) . '</td>'; echo '<td>' . htmlspecialchars($model[1]) . '</td>'; echo '<td>' . htmlspecialchars($model[2]) . '</td>'; echo '</tr>'; $modelIndex++; } } echo '</tbody>'; echo '</table>'; ?>
说明:这里用了rowspan合并同品牌的单元格,让表格看起来更整洁;如果不需要合并单元格,直接去掉rowspan相关代码,每个车型行都重复显示品牌信息即可。
把以上代码放在同一个PHP文件里就能运行了,用户选择国家提交后,表格会自动过滤显示对应国家的车辆数据。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

