我正在尝试为车辆制造商和车辆模型创建动态下拉列表。我希望用户能够在第一个下拉列表中选择车辆的制造商,然后让第二个下拉列表填充所选车辆的相关模型。我有一个包含所有车辆品牌和型号的CSV文件-文件中有900多个型号。我已经成功地使用Javascript完成了这项工作,但是有太多的车辆模型无法通过这种方式进行编码。
我尝试使用PHP读取CSV文件并构建一个数组,然后在PHP foreach循环中回显Javascript代码。如果仅在PHP中运行foreach循环,则可以成功地将Javascript代码的这一部分回显到HTML页面。但是,一旦将PHP代码放入函数中并在页面中调用该函数,就会出现错误。我的疑难解答使我相信我需要使用Ajax之类的东西,但是我不熟悉Ajax,并希望我能按原样接近解决方案,只是需要一些有关如何继续的见识。另外,我没有在此处编写Javascript代码,而是通过Google搜索找到的。虽然我了解基本知识,但是我对Javascript并不精通。任何帮助将不胜感激。谢谢。
Javascript:这是按原样工作的,但我不想这样输入900个项目:
<script language="javascript" type="text/javascript">
function dynamicdropdown(listindex)
{
switch (listindex)
{
case "Acura" :
document.getElementById("status").options[0]=new Option("Select","");
document.getElementById("status").options[1]=new Option("CL","CL");
document.getElementById("status").options[2]=new Option("Integra","Integra");
document.getElementById("status").options[3]=new Option("Legend","Legend");
break;
case "Audi" :
document.getElementById("status").options[0]=new Option("Select","");
document.getElementById("status").options[1]=new Option("80","80");
document.getElementById("status").options[2]=new Option("90","90");
document.getElementById("status").options[3]=new Option("100","100");
break;
}
return true;
}
</script>
<div class="category_div" id="category_div">Make:
<select id="source" name="source" onchange="javascript:dynamicdropdown(this.options[this.selectedIndex].value);">
<option value="">Select Make</option>
<option value="Acura">Acura</option>
</select>
</div>
<div class="sub_category_div" id="sub_category_div">Model:
<script type="text/javascript" language="JavaScript">
document.write('<select name="status" id="status"><option value="">Select status</option></select>')
</script>
PHP:如果我删除该函数并仅在页面上回显结果,它将正确构建Javascript:
<?php
$filename = 'list.csv';
// The nested array to hold all the arrays
$vehicle_array = [];
// Open the file for reading
if (($h = fopen("{$filename}", "r")) !== FALSE){
// Each line in the file is converted into an individual array called $data
// The items of the array are comma separated
while (($data = fgetcsv($h, 1000, ",")) !== FALSE){
// Each individual array is being pushed into the nested array
$vehicle_array[] = $data;
}
// Close the file
fclose($h);
}
// Display the code in a format I can read
foreach ($vehicle_array as $row) {
if ($row[2] == -1) {
unset($vehicle_array[$row[2]]);
echo 'break;';
} elseif ($row[2] == 0) {
echo 'case "';
echo $row[0];
echo '" :';
echo 'document.getElementById("status").options[';
echo $row[2];
echo ']=new Option("';
echo $row[1];
echo '","';
echo "";
echo '");';
} else {
echo 'document.getElementById("status").options[';
echo $row[2];
echo ']=new Option("';
echo $row[1];
echo '","';
echo $row[1];
echo '");';
}
}
?>
这就是中断的地方:我将foreach循环放在函数内,然后在页面稍后调用该函数以构建Javascript的该部分。
<script language="javascript" type="text/javascript">
function dynamicdropdown(listindex)
{
switch (listindex)
{
<?php buildForm(); ?>
}
return true;
}
</script>
我收到这些错误:
这是直接来自Google Chrome的错误消息:
function dynamicdropdown(listindex){switch(listindex){
通知:未定义变量: 25
行中的 C:\ xampp \ htdocs \ test \ drop.php 中的vehicle_array
警告:在 25
行的 C:\ xampp \ htdocs \ test \ drop.php 中为foreach()提供了无效的参数
有关完整的错误消息,请参见图像。再次,这里的任何帮助将不胜感激。再次感谢!
答案 0 :(得分:0)
问题是您尝试将$vehicle_array
中的buildForm
用作全局变量,但没有使用global
关键字。有两种可能的解决方案:
尽可能避免使用全局变量,因此,在我们的情况下,您需要更改两行:
function buildForm($vehicle_array){
buildForm($vehicle_array);
选择这个。拜托。
在$vehicle_array
中使用function
之前,请确保此行将其用作global
变量:
global $vehicle_array;
这似乎很奇怪,但这就是语法的工作原理。在此处阅读更多信息:https://phppot.com/php/variable-scope-in-php/