php - 在 php 中按字母顺序显示 html li 元素

标签 php foreach html-lists vertical-alignment

我有一个如下所示的PHP代码,它在字母表下按列显示项目列表(列表)(显示在下面的 fiddle 中)。

php代码:

if ( is_array( $beta_lists ) && ! empty( $beta_lists ) ) :
    $before_title_character  = '';
    echo "<pre>"; print_r($beta_lists); echo "</pre>";   // Line A
    ?>
    <ul id="programs-list" class="programs-list js-list-active">
        <?php foreach ( $beta_lists as $title => $permalink ) :
            $character_title=substr(transliterator_transliterate('Any-Latin;Latin-ASCII;', $title),0,1);
             ?>
            <li class="shows-list__letter">
                <?php if ( $character_title !== $before_title_character ) : $before_title_character = $character_title; ?>
                    <h1 class="shows-list__letter-title"><?php echo esc_html( $character_title ) ?></h1>
                <?php  endif; ?>
                 <a class="shows-list__link" href="<?php echo esc_url( $permalink ); ?>"> <h2 class="shows-list__title"><?php echo esc_html( $title ); ?></h2>
                 </a>
            </li>
        <?php
        endforeach;
        ?>
    </ul>
<?php endif; ?>

我尽力通过 php 复制 fiddle 中的 DOM。 https://jsfiddle.net/s4x1zf7L/3/ fiddle 中的 CSS 正是我当前正在使用的。

问题陈述:

虽然列表在字母下按列显示,但 fiddle 中的问题是这样的,

1.第二列开始是一个不带字母的列表。 (在 fiddle 中,学士列表从另一列开始。它应该仅在第一列中)

2. 在字母表下添加新列表通常会导致第二列顶部的另一个列表成为孤立列表。

我想知道我应该在上面的 php 代码中进行哪些更改,以便在 fiddle2 个字母应位于一列2 个字母应位于另一列,不带 第二列中任何孤立的列表。

如果我们添加 7 个(奇数)字母表,则 4 个字母表应位于左列,3 个字母表应位于右列,而第二列中没有任何列表被孤立。

(第二列应始终以字母开头,其下方是列表。)

上面的 php 代码中的

A 行打印以下数组:

Array
(
    [Apple] => http://www.abc.mno/apple/
    [Ball] => http://www.abc.mno/ball/
    [Builders] => http://www.abc.mno/builders/
    [Bowling] => http://www.abc.mno/bowling/
    [Batting] => http://www.abc.mno/batting/
    [Bone] => http://www.abc.mno/bone/
    [Bachelor] => http://www.abc.mno/bachelor/
    [Correct] => http://www.abc.mno/correct/
    [Campaign] => http://www.abc.mno/compain/
    [Direct] => http://www.abc.mno/direct/
    [Degree] => http://www.abc.mno/degree/
)

数组中的元素数量可以根据存在的值而变化

这是我尝试过的:

我尝试通过在第二列中添加边距来避免使用 css 元素孤儿,但每次添加新列表时,我都必须修改我认为的 css 值 不是一个长期的解决方案。

注意: DOM 不在我的控制范围内。只有 php 是在我的控制范围内的。

最佳答案

您需要删除倍数 <li>相同字母元素之间。 这是您的代码:

<li class="shows-list__letter">
  <h1 class="shows-list__letter-title">B</h1>
  <a class="shows-list__link" href="http://www.abc.mno/ball/">
     <h2 class="shows-list__title">Ball</h2>
  </a>
</li>
<li class="shows-list__letter">
  <a class="shows-list__link" href="http://www.abc.mno/builders/">
     <h2 class="shows-list__title">Builders</h2>
  </a>
</li>
...

事情应该是这样的:

<li class="shows-list__letter">
  <h1 class="shows-list__letter-title">B</h1>
  <a class="shows-list__link" href="http://www.abc.mno/ball/">
     <h2 class="shows-list__title">Ball</h2>
  </a>
  <a class="shows-list__link" href="http://www.abc.mno/builders/">
     <h2 class="shows-list__title">Builders</h2>
  </a>
  <a class="shows-list__link" href="http://www.abc.mno/bowling/">
     <h2 class="shows-list__title">Bowling</h2>
  </a>
 ....

然后添加此内容以避免元素之间分页:

.shows-list__letter {
    -webkit-column-break-inside: avoid;
    page-break-inside: avoid;
    break-inside: avoid;
}

此处的结果:https://jsfiddle.net/0ndajurv/

更新

在你的 PHP 更改中

<li class="shows-list__letter">
    <?php if ( $character_title !== $before_title_character ) : $before_title_character = $character_title; ?>
        <h1 class="shows-list__letter-title"><?php echo esc_html( $character_title ) ?></h1>
    <?php  endif; ?>
    <a class="shows-list__link" href="<?php echo esc_url( $permalink ); ?>">
        <h2 class="shows-list__title"><?php echo esc_html( $title ); ?></h2>
    </a>
</li>

<?php if ( $character_title !== $before_title_character ) : ?>
    <li class="shows-list__letter">
        <h1 class="shows-list__letter-title"><?php echo esc_html( $character_title ) ?></h1>
<?php  endif; ?>
        <a class="shows-list__link" href="<?php echo esc_url( $permalink ); ?>">
            <h2 class="shows-list__title"><?php echo esc_html( $title ); ?></h2>
        </a>
<?php if ( $character_title !== $before_title_character ) : 
        $before_title_character = $character_title; ?>
    </li>
<?php  endif; ?>

关于php - 在 php 中按字母顺序显示 html li 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61758018/

相关文章:

php - 在 html/php 的单独表格行中显示目录中的文件名

html - CSS:无序列表对齐

php - 我应该如何从 php 传递的 $id 的两个表中检索正确的信息

php - 在 PHP 中翻译 torrent 的公告请求中的 info_hash

php函数以数组形式返回包含数组的sql结果

html - pandoc Markdown 中的降序列表

html - 垂直对齐内联列表项上的文本

php - 为每个帖子选择反对票和赞成票 php mysql

php - Doctrine - 生产服务器上的警告消息

ios - SwiftUI 中的 ForEach TextField