我的codeigniter应用程序中有一个视图,它从数据库中获取一个数组。 我想根据数组的内容创建几个组合框。
这是数组的样子:
Array (
[0] => Array (
[L1ID] => 2
[L1Location] => USA
[L2ID] => 3
[L2Location] => New York
[L3ID] => 4
[L3Location] => Manhanttan
)
[1] => Array (
[L1ID] => 2
[L1Location] => USA
[L2ID] => 8
[L2Location] => New Jersey
[L3ID] => 7
[L3Location] => Bergen County
)
[2] => Array (
[L1ID] => 5
[L1Location] => Canada
[L2ID] => 12
[L2Location] => Ontario
[L3ID] => 50
[L3Location] => Toronto
)
[3] => Array (
[L1ID] => 6
[L1Location] => South Korea
[L2ID] => 22
[L2Location] => Gyungido
[L3ID] => 25
[L3Location] => Buchon
)
)
如您所见,数组中的每个项目最多可以定义3个位置。 我想创建一个包含所有Location 1的组合框。 换句话说,它将有“美国”,“加拿大”,“韩国”作为选项。当用户点击任何位置时,我想查询同一个阵列并获得下一级别 - 所有位置2 - 填充在单独的组合框中。 因此,例如,当他们在位置1中选择“USA”时,位置2组合将显示“纽约”和“新泽西”作为选项。
我已经编写了一些代码来开始循环遍历数组并提取所有L1(位置1),但我不知道如何防止重复添加。
这是我的代码:
<select id="L1locationlist" name="L1locationlist">
<option value=""></option>
<?php
foreach ($locations as $location) {
echo ($location['L1ID'].'<BR>');
echo '<option value="' . $location['L1ID'] . '">' . $location['L1Location'].'</option>';
}
?>
</select>
我只想在组合框中输入一个美国条目。 你能告诉我怎么做吗?我是否必须创建一个单独的函数来检查它是否已存在于组合框中? 谢谢。
修改
最初的计划是从数据库获取一次所有位置信息,然后在客户端,以某种方式根据用户点击的内容动态深入到不同的位置。 但我想我也应该问这是不是一个好的设计?如果我只是对数据库进行单独调用,那么代码可能会“更干净”。例如,我最初将获得所有位置1的值。然后,如果用户选择“USA”,我将再次查询db以查看美国的所有子位置。 我想最初的想法是保存多次前往数据库。 任何意见?
答案 0 :(得分:1)
我要做的第一件事就是解析数组以获得你想要的格式的所有ocations:
$parsedLocations = array(1 => array(), 2 => array(), 3 => array());
foreach ($locations as $location) {
for($i = 1; $i < 4; $i++) {
$parsedLocations[i][$location['L' . $i . 'ID']] = $location['L' . $i . 'Location']
}
}
获得所需的阵列后,您只需显示这些项目,并使用array_unique()
使其成为唯一:
<select id="L1locationlist" name="L1locationlist">
<option value=""></option>
<?php
$locations = array_unique($parsedLocations[1]);
foreach($locations as $key => $location) {
echo ' <option vaue="' . $key . '">' . $location . '</option>';
}
?>
</select>
如果您想为所有三个位置动态执行此操作,您可以执行以下操作(使用相同的已解析位置数组):
<?php
for ($i = 1; $i < 4; $i++) {
echo '<select id="L' . $i . 'locationlist" name="L' . $i . 'locationlist">';
echo ' <option value=""></option>';
$locations = array_unique($parsedLocations[1]);
foreach($locations as $key => $location) {
echo ' <option vaue="' . $key . '">' . $location . '</option>';
}
echo '</select>';
}
答案 1 :(得分:0)
遍历$locations
数组并为每个框生成一个新数组,随时检查值。然后,遍历每个阵列并生成框。 (Demo.)
<?php
$countries = array();
$states = array();
$cities = array();
foreach ($locations as $location) {
if(!array_key_exists($location['L1ID'], $countries))
$countries[$location['L1ID']] = array(
'name' => $location['L1Location'],
'states' => array(),
);
if(!array_key_exists($location['L2ID'], $countries[$location['L1ID']]['states'])){
$countries[$location['L1ID']]['states'][$location['L2ID']] = array(
'name' => $location['L2Location'],
'cities' => array(),
);
}
if(!array_key_exists($location['L3ID'], $countries[$location['L1ID']]['states'][$location['L2ID']])){
$countries[$location['L1ID']]['states'][$location['L2ID']]['cities'][$location['L3ID']] = $location['L3Location'];
}
}
// Generate $countries box
foreach ($countries as $key => $country) {
echo ($key.'<BR>'."\n");
echo '<option value="' . $key . '">' . $country['name'].'</option>'."\n";
// Generate $states box
foreach ($country['states'] as $key => $state) {
echo ($key.'<BR>'."\n");
echo '<option value="' . $key . '">' . $state['name'].'</option>'."\n";
// Generate $city box
foreach ($state['cities'] as $key => $city) {
echo ($key.'<BR>'."\n");
echo '<option value="' . $key . '">' . $city.'</option>'."\n";
}
}
}
?>
答案 2 :(得分:0)
试试这个
$i = 1;
foreach ($locations as $location) {
if(isset($locations[$i-1]['L1Location']) && $locations[$i-1]['L1Location'] != $location['L1Location'] && $i != 1){
echo ($location['L1ID'].'<BR>');
echo '<option value="' . $location['L1ID'] . '">' . $location['L1Location'].'</option>';
$i++;
}
}
除此之外,如果你在查询中按L1Location进行分组,则不需要像上面简单的foreach循环那样进行编码