我的行动计划是:
- 循环遍历字母表 的数组
- 在循环中,打印当前字母
- 而在循环中,遍历存储在数组中的城市对象列表。
- 检查$city->city_name属性的第一个字母是否与循环中的当前字母匹配。如果匹配,打印出来。
- 如果没有匹配,打印一条消息。
这是我能让它显示的全部内容:
没有结果要显示。
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 ,因此每个新字母都会再次检查。