我正在用PHP动态创建一些选择下拉列表。
<select name="player_id" style="width:140px;">
<?php usort($players, 'compareName'); ?>
<?php foreach ($players as $player) { ?>
<option value="<?php echo $player['id']; ?>"><?php echo $player['first_name'] . " " . $player['last_name']; ?></option>
<?php } ?>
</select>
$players数组目前大约有1600条记录。select下拉列表大约创建20次,这意味着它循环遍历1600条记录20次。
我的问题是关于加载时间…是否有一种方法,我可以创建相同的选择一次,然后输出它一遍又一遍,以提高加载时间,而不是让它循环每次?或者这将被视为最佳实践?
当然!您可以加载它一次,将其保存在一个变量中,并在需要的地方回显它!
你可以这样做:
<?php
$long_options_list = "";
usort($players, 'compareName');
foreach ($players as $player) {
$long_options_list .= '<option value="'.$player['id'].'">'. $player['first_name'] . " " . $player['last_name'].'</option>';
}
?>
使用方法如下:
<select name="player_id" style="width:140px;">
<?php echo $long_options_list; ?>
</select>
关于排序,如果你只使用一次usort
不会影响你的性能,但是在你的查询中使用ORDER BY
肯定是最好的选择!
要给您一些代码来说明如何保存动态html的输出,请尝试这样做:
<?php
//ignore this, I'm just generating some players as an example.
$players = array();
for ($i=0; $i < 1600 ; $i++) {
$players[] = array("first_name" => uniqid(), "last_name" => uniqid(), "id" => $i);
}
ob_start();
?>
<select name="player_id" style="width:140px;">
<?php usort($players, 'compareName'); ?>
<?php foreach ($players as $player) { ?>
<option value="<?php echo $player['id']; ?>"><?php echo $player['first_name'] . " " . $player['last_name']; ?></option>
<?php } ?>
</select>
<?php
$list = ob_get_clean();
echo $list;
echo $list;
?>
同样,如果你想弄清楚性能,使用数据库而不是对它们进行排序也会有所帮助。只要你比较它们的方式可以由你的数据库完成,并且它是正确的索引。
如果玩家是在一个DB上,然后使用ORDER BY
当你SELECT
他们让DB引擎为你订购他们。
添加索引以加快速度。即使有这么多玩家,引擎也有办法在内存中缓存信息,所以你会注意到当前情况的改进。