我有一组用户,如下所示:
Andrew Smith
Alex Williams
Sam White
Stuart Smith
我希望使用iOSList创建一个看起来像这样的列表....
A
Andrew Smith
Alex Williams
S
Sam White
Stuart Smith
我已经尝试使用PHP Foreach循环和中断,但每个用户每次都有一个单独的ul。
我目前的代码如下:
<?php
$currentLetter = '';
foreach($pupils['user'] as $pupil)
{
$firstLetter = substr($pupil->profile_name, 0, 1);
?>
<?php
if ($firstLetter !== $currentLetter) { ?>
<!-- SHOW FIRST LETTER -->
<div class="ioslist-group-container">
<div class="ioslist-group-header">
<strong>
<?php echo $firstLetter; ?>
</strong>
</div><!-- /.ioslist-group-header -->
<?php $currentLetter = $firstLetter; ?>
<?php } ?>
<ul>
<li>
<a href="<?php echo base_url('admin/pupil/view'); ?>/<?php echo $pupil->user_id; ?>">
<?php echo $pupil->profile_name; ?>
</a>
</li>
</ul>
</div><!-- /.iostlist-group-container -->
<?php } // END FOREACH ?>
我的HTML输出如下:
<div id="pupil-list">
<!-- SHOW FIRST LETTER -->
<div class="ioslist-group-container">
<div class="ioslist-group-header">
<strong>
A </strong>
</div><!-- /.ioslist-group-header -->
<ul>
<li>
<a href="http://local.wld-hub/admin/pupil/view/10">
Adam Bragg </a>
</li>
</ul>
</div><!-- /.iostlist-group-container -->
<!-- SHOW FIRST LETTER -->
<div class="ioslist-group-container">
<div class="ioslist-group-header">
<strong>
S </strong>
</div><!-- /.ioslist-group-header -->
<ul>
<li>
<a href="http://local.wld-hub/admin/pupil/view/11204">
Sam acclaiminapp </a>
</li>
</ul>
</div><!-- /.iostlist-group-container -->
<ul>
<li>
<a href="http://local.wld-hub/admin/pupil/view/11194">
Sam NormalEmail </a>
</li>
</ul>
</div>
最后两个元素突破了&#34; 学生列表&#34;
我哪里出错了,我该如何纠正?
干杯
答案 0 :(得分:2)
我不喜欢你的例子中PHP和HTML的混合。我更喜欢使用所有PHP代码。你的基本想法是正确的,但它会变成:
function showFirstLetter($letter)
{
echo '<div class="ioslist-group-header"><strong>'.$letter.'</strong></div>';
}
function showPupilName($pupil)
{
$url = base_url('admin/pupil/view').'/'.$pupil->user_id;
echo '<li><a href="'.$url.'">'.$pupil->profile_name.'</a></li>';
}
echo '<div class="ioslist-group-container">'; // start container
$currentLetter = '';
foreach($pupils['user'] as $pupil)
{
$firstLetter = substr($pupil->profile_name,0,1);
if ($firstLetter !== $currentLetter)
{
if ($currentLetter != '') echo '</ul>'; // end list
showFirstLetter($firstLetter);
$currentLetter = $firstLetter;
echo '<ul>'; // start list
}
showPupilName($pupil);
}
echo '</ul></div>'; // end last list and container
在此代码中可以改进很多东西,但是当您的代码更清晰时,您可以更快地看到错误。在这种情况下,ul
列表标签就是问题所在。
答案 1 :(得分:1)
问题似乎是你没有在每组结尾处正确关闭你的元素;您可以检查$firstLetter
是否为空,如果不是{空}则关闭</div>
;这也必须在最后重复。
或者,建立一个中间结构:
$tmp = [];
foreach ($pupils['user'] as $pupil) {
$tmp[$pupil->profile_name[0]][] = $pupil->profile_name);
}
foreach ($tmp as $letter => $names) { ?>
<div class="ioslist-group-container">
<div class="ioslist-group-header">
<strong><?php echo $firstLetter; ?></strong>
</div>
<ul>
<?php foreach ($names as $name) { ?>
<li>
<a href="<?php echo base_url('admin/pupil/view') . '/' . $pupil->user_id; ?>"><?php echo $pupil->profile_name; ?></a>
</li>
<?php } ?>
</ul>
</div>
<?php }
请注意,您应该使用htmlspecialchars()
或urlencode()
来转义输出,具体取决于转发的内容。
答案 2 :(得分:1)
每次只创建一个项目的用户列表。
<?php
// Display user list
$currentLetter = '';
foreach($pupils['user'] as $pupil)
{
$firstLetter = $pupil->profile_name[0];
if($firstLetter !== $currentLetter)
{
// If it's not the first loop, we close the list and block containers
if($currentLetter !== '')
{
?>
</ul>
</div>
<?php
}
?>
<!-- SHOW FIRST LETTER -->
<div class="ioslist-group-container">
<div class="ioslist-group-header">
<strong><?php echo $firstLetter; ?></strong>
</div><!-- /.ioslist-group-header -->
<ul>
<?php
}
?>
<li><?php echo $pupil->profile_name; ?></li>
<?php
}
// Close the last list and block containers
?>
</ul>
</div>
<?php
// End of display