如何按字母顺序列出带有标题的项目,如果没有找到匹配项,则显示消息


How to list items in alphabetical order with a heading and if no match is found display a message

我的行动计划是:

  1. 循环遍历字母表
  2. 的数组
  3. 在循环中,打印当前字母
  4. 而在循环中,遍历存储在数组中的城市对象列表。
  5. 检查$city->city_name属性的第一个字母是否与循环中的当前字母匹配。如果匹配,打印出来。
  6. 如果没有匹配,打印一条消息。

这是我能让它显示的全部内容:

没有结果要显示。

B

没有结果要显示。

C

城市

没有结果要显示。

D

没有结果要显示。

E

城市

没有结果要显示。

可以看到,即使存在匹配,也会显示错误。我似乎不知道我的逻辑上的缺陷在哪里,我已经搜索了关于这个话题的每一个问题。是不是有什么明显的东西我没注意到?

代码:

<?php
function printValues($cities, $county) 
{
    $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $letters = str_split($str);
    $lettersMatched = FALSE;
    foreach ($letters as $letter) 
    {
        echo "<h5 class='"letter'">".$letter."</h5><hr>";
        foreach ($cities as $city) 
        {
            if(substr($city->city_name, 0, 1) == $letter) 
            {
                $lettersMatched = TRUE;
                $result = $city->city_name;
                echo "<p><a href='"".site_url("/listings/county/".$county."/city/".$result)."'">".$result."</a></p>";
                $lettersMatched = FALSE;
            }
        } 
        if (!$lettersMatched) 
        {
            echo "<p>There are no results to display.</p>";
        }
    }
}
?>

在if语句中将$lettersMatched重置为false。试试这个:

<?php
function printValues($cities, $county) 
{
    $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $letters = str_split($str);
    //$lettersMatched = FALSE;
    foreach ($letters as $letter) 
    {
        echo "<h5 class='"letter'">".$letter."</h5><hr>";
        $lettersMatched = FALSE;
        foreach ($cities as $city) 
        {
            if(substr($city->city_name, 0, 1) == $letter) 
            {
                $lettersMatched = TRUE;
                $result = $city->city_name;
                echo "<p><a href='"".site_url("/listings/county/".$county."/city/".$result)."'">".$result."</a></p>";
                // $lettersMatched = FALSE;
            }
        } 
        if (!$lettersMatched) 
        {
            echo "<p>There are no results to display.</p>";
        }
    }
}
?>
$matches = false;
foreach(range('A', 'Z') AS $letter)
{
    echo $letter . '<hr>';
    foreach( $cities AS $city )
    {
        if( strtoupper(substr($city->city_name, 0, 1)) ===  $letter)
        {
            $matches = true;
            echo "<p>" . $city->city_name . "</p>";
        }
    }
    if(!$matches)
        echo "<p>No matches here</p>";
    $matches = false;
}

您所做的是将匹配设置为false,紧接着在内循环中将其设置为true。所以当你的代码达到循环外的条件时,总是false

我所做的是将条件后的匹配设置为false ,因此每个新字母都会再次检查。