PHP 创建的 HTML 是乱序创建的

HTML created by PHP is created out of sequence

我有一个 PHP 文件输出一些 HTML.

为了便于配置,我有一个 second PHP 文件包含在 first PHP 文件中。该包含文件仅包含如下数组定义:

<?
$myArray = array("key1"=>"value 1","key2"=>"value 2","key3"=>"value 3");
?>

在我的第一个 PHP 文件中,我有以下内容

<? include("second.php"); ?>

<label>Select here:
<select id='mySelect'>
<? foreach ($myArray as $keyString=>$valueString) { ?>
    <option value='<?= $keyString; ?>'><?= $valueString; ?></option>
<? } ?>
</select>
</label>

但是 HTML 输出生成如下:

<label>Select here:
<select id='mySelect'>
</select>
<option value='key1'>value 1</option>
<option value='key2'>value 2</option>
<option value='key3'>value 3</option>
</label>

它呈现为一个空的 select 下拉菜单,下面显示了选项的文本!

我敢肯定这是一件愚蠢而简单的事情,因为我敢肯定我以前做过很多次都没有问题...


[更新]

经过调查发现,只有当我在 FancyBox 中显示 first PHP 页面时才会发生这种情况 - 当我直接加载它时,选项包含在 <select> 中你会期望。

FancyBox是通过JavaScript通过图像的onClick事件打开如下(图像在FancyBox打开的背景页面上,它不是first.php或[的一部分=54=]):

<img src="myImage.png" alt="my image" onClick="openFirstPHP();">

在我的 JavaScript 中,我有(在 first.js 中,它包含在 first.php 中,带有通常的 <SCRIPT> 标签:

function openFirstPHP() {
    $.fancybox({
        href: "/first.php",
        type: "ajax",
        afterShow: function() {
            // do some setting of some radio buttons' states - which works fine
        }
    });
}

有关信息,我以这种方式调用 first.php 而不是在 iFrame 中调用的原因是它也与调用页面交互,因此避免了我必须引用不同的文档对象(我认为).

基本上在 first.php 中其他一切都没有问题 - cookie 的读取和设置,与调用 PHP 页面变量的交互等。唯一不起作用的是插入这些 <options> 标签与 <select> 标签顺序不一致。

将循环从 'for' 更改为 'foreach'。

你写了一个 for 循环,但你把它当作一个 foreach 循环。

这应该有效:

<? foreach ($myArray as $keyString=>$valueString) { ?>
    <option value='<?= $keyString; ?>'><?= $valueString; ?></option>
<? } ?>

试试这个:

<?php include_once("second.php");
 ?>

<label>Select here:
<select id='mySelect'>
<?php foreach ($myArray as $keyString=>$valueString) { ?>
    <option value='<?php echo $keyString; ?>'><?php echo $valueString; ?></option>
<?php } ?>
</select>
</label>

结果证明这是一个奇怪的问题,是我的 HTML 标记中的拼写错误造成的,而不是 PHP 或乱序标记生成的问题。

我的开头 <select> 语句中有一个杂散的 /。即

<select id='mySelect' />.

因为浏览器会尽力理解格式错误的 HTML,在检查器中查看 <select> 后紧跟 </select> 然后是我的选项和结束 </select> 从我的代码中被完全删除,因此 <option> 语句在 select 之外,因此被忽略。

不过,奇怪的是,这只发生在 FancBoxy 内部调用时,当直接调用页面时它没有问题!

删除开头 <select> 语句中错误放置的 / 完全解决了问题。