加载按字母顺序排列的数组

时间:2014-12-17 09:31:06

标签: php html arrays

我有一组用户,如下所示:

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;

broken menu

我哪里出错了,我该如何纠正?

干杯

3 个答案:

答案 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