改进动态选择下拉的加载时间


Improving Load Time for Dynamic Select Drop Down

我正在用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引擎为你订购他们。

添加索引以加快速度。即使有这么多玩家,引擎也有办法在内存中缓存信息,所以你会注意到当前情况的改进。