PHP中嵌套循环的替代方案

时间:2017-04-08 06:48:41

标签: php mysql nested-loops

我试图从MySQL数据库中显示国家明智的城市细节,其中包含大约1000万行的庞大数据库。我创建了以下代码,工作正常。然而,在显示时,由于MySQL中的庞大数据库,它需要花费大量时间。任何人都可以帮我写替代嵌套循环,因为看起来嵌套循环是一个需要花费大量时间的循环。此代码的目的是以UL和LI格式显示州名及其相应的城市。一个替代方案似乎按字母顺序分析结果。欢迎任何其他建议:

这是我的代码:

DisplayFormat:
<ul>State1
<li>City1</li>
<li>City3</li>
<li>City3</li>
<li>City4</li>
</ul>
<ul>State2
<li>City1</li>
<li>City3</li>
<li>City3</li>
<li>City4</li>
</ul>
<ul>State3
<li>City1</li>
<li>City3</li>
<li>City3</li>
<li>City4</li>
</ul>


PHP CODE:
function cityListings(){
global $conn;
$state="SELECT DISTINCT state FROM members";
$query=mysqli_query($conn,$state);
while($row=mysqli_fetch_assoc($query))
{
    $state=$row['state'];
?>
                    <div>
                        <ul>
                            <?php echo $state; ?>
                                <?php city($state); ?>
                        </ul>
                    </div>
                    <?php }
}

function city($state){
global $conn;
$city="SELECT DISTINCT city from members WHERE state='$state'";
    $query=mysqli_query($conn,$city);
    while($row=mysqli_fetch_assoc($query))
    {
        $city=$row['city'];
        ?>
                        <a href="city.php?city=<?php echo $city; ?>" style="text-decoration:none;">
                            <li style="color:blue;">
                                <?php echo $city; ?>
                            </li>
                        </a>
                        <?php }
}

1 个答案:

答案 0 :(得分:0)

首先,您必须在字段state上的数据库中拥有索引才能进行快速搜索。这个可以大大加快你的要求。

其次,您可以在一个请求中请求所有需要的数据,而不是枚举它们。如果您不想按城市名称排序,则必须在字段statecity上为此代码设置索引,或者至少在state上设置索引(在这种情况下,从ORDER部分删除城市)

function cityListings(){
global $conn;
$state="SELECT DISTINCT state, city FROM members ORDER BY state, city"; // select all distinct pairs (city, state)
$query=mysqli_query($conn,$state);
$prev_state = null;
while($row=mysqli_fetch_assoc($query))
{
    $state=$row['state'];
    $city=$row['city'];

    if( $state != $prev_state ) // new state begins
    {
        if( $prev_state != null ) // close previous state block
        {
            echo( '</ul></div>' );
        }
        echo( '<div><ul>'.$state ); // begin new state block

        $prev_state = state;
    }
?>
<a href="city.php?city=<?php echo $city; ?>" style="text-decoration:none;">
                            <li style="color:blue;">
                                <?php echo $city; ?>
                            </li>
                        </a>
<?php
}
if( $prev_state != null ) // close last state block
{
    echo( '</ul></div>' );
}