开发者

Show first letter of a list once?

I have a list of directory name and need to get the first letter from each name and just display it once before the start of that lettered group ie;

what I have:

1

2

3

4

5

Aberdeen

Arundel

Aberyswith

Bath

Bristol

Brighton

Cardiff

coventry

what I would like:

#

1

2

3

4

5

A

Aberdeen

Arundel

Aberyswith

B

Bath

Bristol

Brighton

C

Cardiff

coventry

function htmlDirList($subdirs) {
    global $z_self, $z_img_play, $z_img_lofi, $z_img_more, $z_admin,
        $z_img_down, $z_img_new, $zc;

    $now = time();
    $diff = $zc['new_time']*60*60*24;
    $num = 0;
    $dir_list_len = $zc['dir_list_len'];
    if ($zc['low']) { $dir_list_len -= 2; }
    $html = "";
    $checkbox = ($z_admin || ($zc['playlists'] && $zc['session_pls']));

    /**/
    $row = 0;
    $items = sizeof($subdirs);
    $cat_cols = "2";
    $rows_in_col = ceil($items/$cat_cols);
    if ($rows_in_col < $cat_cols) { $cat_cols = ceil($items/$rows_in_col); }
    $col_width = round(100 / $cat_cols);
    $html = "<table width='600'><tr>";
    $i = 0;
    /**/
    foreach ($subdirs as $subdir => $opts) {

        if ($row == 0) {
            $class = ($cat_cols != ++$i) ? ' class="z_artistcols"' : '';
            $html .= "<td $class valign='top' nowrap='nowrap' width='$col_width%'>";
        }
        /*$currentleter = substr($opts, 0 , 1);
        if($lastletter != $currentleter){
        echo $currentleter;
        $lastletter = $currentleter;
        }*/

        if($alphabet != substr($opts,0,1)) {
        echo strtoupper(substr($opts,0,1)); // add your html formatting too.
        $alphabet = substr($opts,0,1);
        }


        $dir_len = $dir_list_len;
        $dir = false;
        $image = $opts['image'];
        $new_beg = $new_end = "";
        if (substr($subdir, -1) == "/") {
            $dir = true;
            $subdir = substr($subdir, 0, -1);
        }

        $path_raw = getURLencodedPath($subdir);

        $href = "<a href='$path_raw";
        if (!$dir) {
            if ($zc['download'] && $zc['cmp_sel']) { $html .= "$href/.lp&amp;l=8&amp;m=9&amp;c=0'>$z_img_down</a> &nbsp;"; }
            if ($zc['play']) { $html .= "$href&amp;l=8&amp;m=0'>$z_img_play</a> &nbsp;"; }
            if ($zc['low'] && ($zc['resample'] || $opts['lofi'])) { $html .= "$href&amp;l=8&amp;m=0&amp;lf=true'>$z_img_lofi</a> &nbsp;"; }
            if ($checkbox) { $html .= "<input type='checkbox' name='mp3s[]' value='$path_raw/.lp'/> &nbsp;"; }
            $num++;
            if ($zc['new_highlight'] && isset($opts['mtime']) && ($now - $opts['mtime'] < $diff)) {
                $dir_len -= 5;
                if ($z_i开发者_StackOverflow中文版mg_new) {
                    $new_end = $z_img_new;
                } else {
                    $new_beg = $zc['new_beg'];
                    $new_end = $zc['new_end'];
                }
            }
        }
        $title = formatTitle(basename($subdir));
        if (strlen($title) > $dir_len) {
            $ht = " title=\"$title.\"";
            $title = substr($title,0,$dir_len).$opts['mtime']."...";
        } else {
            $ht = "";
        }

        if ($zc['dir_list_year']) {
            $di = getDirInfo($subdir);
            if (!empty($di['year'])) $title .= " (".$di['year'].")";
        }

        $html .= "$href'$ht>$new_beg$title$new_end</a><br />";
        $row = ++$row % $rows_in_col;
        if ($row == 0) { $html .= "</td>"; }
    }

    if ($row != 0) $html .= "</td>";
    $html .= "</tr></table>";
    $arr['num'] = $num;
    $arr['list'] = $html;
    return $arr;
}

I need help to get work.


The following will display the list of directories, beginning each group with a first letter as beginning of the group (see codepad for proof):

(this assumes $dirs is array containing the names)

$cur_let = null;
foreach ($dirs as $dir) {
    if ($cur_let !== strtoupper(substr($dir,0,1))){
        $cur_let = strtoupper(substr($dir,0,1));
        echo $cur_let."\n";
    }
    echo $dir . "\n";
}

You just need to add some formatting on your own, suited to your needs.

Edit:

Version grouping under # sign entries that begin with a number, can look like that:

$cur_let = null;
foreach ($dirs as $dir) {
    $first_let = (is_numeric(strtoupper(substr($dir,0,1))) ? '#' : strtoupper(substr($dir,0,1)));
    if ($cur_let !== $first_let){
        $cur_let = $first_let;
        echo $cur_let."\n";
    }
    echo $dir . "\n";
}

Please see codepad as a proof.


Is this what you are looking for?

<?php

$places = array(

'Aberdeen',
'Arundel',
'Aberyswith',
'Bath',
'Bristol',
'Brighton',
'Cardiff',
'coventry'

);

$first_letter = $places[0][0];
foreach($places as $p)
{
    if(strtolower($p[0])!=$first_letter)
    {
        echo "<b>" . strtoupper($p[0]) . "</b><br/>";
        $first_letter = strtolower($p[0]);
    }
    echo $p . "<br/>";
}
?>

Prints:

A
Aberdeen
Arundel
Aberyswith
B
Bath
Bristol
Brighton
C
Cardiff
coventry


My approach would be to generate a second array that associates the first letter to the array of names that begin with that letter.

$dirs; // assumed this contains your array of names
$groupedDirs = array();
foreach ($dirs as $dir) {
    $firstLetter = strtoupper($dir[0]);
    $groupedDirs[$firstLetter][] = $dir;
}

Then, you can iterate on $groupedDirs to print out the list.

<?php foreach ($groupedDirs as $group => $dirs): ?>
    <?php echo $group; ?>
    <?php foreach ($dirs as $dir): ?>
        <?php echo $dir; ?>
    <?php endforeach; ?>
<?php endforeach; ?>

This allows for a clean separation between two separate tasks: figuring out what the groups are and, secondly, displaying the grouped list. By keeping these tasks separate, not only is the code for each one clearer, but you can reuse either part for different circumstances.


Use something like this, change it to output the HTML the way you want thouugh:

sort($subdirs);
$count = count($subdirs);
$lastLetter = '';
foreach($subdirs as $subdir => $opts){
    if(substr($subdir,0,1) !== $lastLetter){
        $lastLetter = substr($subdir,0,1);
        echo '<br /><div style="font-weight: bold;">'.strtoupper($lastLetter).'</div>';
    }
    echo '<div>'.$subdir.'</div>';
}

EDIT

Just realized $subdir is associative, made the change above:

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜