如何使用PHP在字母表下显示数组?

时间:2011-10-12 18:58:18

标签: php

我有一个数组已按字母顺序包含所有值:

Alligator
Alpha
Bear
Bees
Banana
Cat
Cougar

现在我只想列出每个首字母开头的内容,如下所示:

A
---

Alligator
Alpha

B
---

Bear
Bees
Banana

C
---

Cat
Cougar

etc...

如何做到这一点?

6 个答案:

答案 0 :(得分:22)

解决方案是在变量中保留先前打印的单词的第一个字母,如:

$previous = null;
foreach($array as $value) {
    $firstLetter = substr($value, 0, 1);
    if($previous !== $firstLetter) echo "\n".$firstLetter."\n---\n\n";
    $previous = $firstLetter;

    echo $value."\n";
}

注意:如果某些条目以小写字母开头而其他条目以大写字母开头,请使用测试中的strcasecmp函数代替!==

答案 1 :(得分:4)

这是另一个简单的解决方案: -

$result = array();
foreach ($list as $item) {
    $firstLetter = substr($item, 0, 1);
    $result[$firstLetter][] = $item;
}

echo "<pre>"; print_r($result);

输出: -

Array (
[A] => Array
    (
        [0] => Alligator
        [1] => Alpha
    )

[B] => Array
    (
        [0] => Bear
        [1] => Bees
        [2] => Banana
    )

[C] => Array
    (
        [0] => Cat
        [1] => Cougar
    )
 )

答案 2 :(得分:1)

我有三个解决方案。 1)创建包含所有字母的另一个数组。然后使用foreach遍历此数组。并且在嵌套的foreach中通过php的strpos方法检查该字母的出现。 这是粗略的代码。

<?php
$alphabets = array ("A","B","C"....); //for all alphabtes
foreach($alphabets as $alphabet)
{
    echo $alphabet;
    foreach($myArray as $arr)
    {
         $pos = strpos($arr, $alphabet);
         if($pos===flase)
         {
             //do nothing
         }
         else
         {
             echo $arr;
         }
}
?>

2)第二种方法具有与上述相同的逻辑。但是在这里你不需要为字母表制作数组。你可以用这种方式获得所有字母。

<?php
foreach(range('a', 'z') as $letter) {
    echo $letter;
}
?>

Php range method

3)第三种解决方案也具有与上述两种相同的逻辑。在这里你可以通过另一种方式获得字母表:)

for ($i=65; $i< =90; $i++) {
 $x = chr($i);
 print $x;
}

答案 3 :(得分:0)

遍历数组并检查当前项是否以前一个字母开头。如果是这种情况打印你的“A ---”。

$currentLetter = '';
foreach ($list as $item) {
   $firstLetter = substr($item, 0, 1);
   if ($firstLetter !== $currentLetter) {
      echo $firstLetter . "\n---\n";
      $currentLetter = $firstLetter;
   }
   echo $item . "\n";
}

答案 4 :(得分:0)

对于HTML输出:

<h3>A</h3>
<ol>
   <li>
      <em>tag count</em>
      <a href="link to tag">Animal</a>
   </li>
   <li>
      <em>tag count</em>
      <a href="link to tag">Aqua</a>
   </li>
   <li>
      <em>tag count</em>
      <a href="link to tag">Arthur</a>
   </li>
</ol>
<!-- if B not EXIST not show B -->
<h3>C</h3>
<ol>
   <li>
      <em>tag count</em>
      <a href="link to tag">Camel</a>
   </li>
   <li>
      <em>tag count</em>
      <a href="link to tag">Crazy</a>
   </li>
</ol>
<!-- etc -->

我更改了Artefact2代码并为您分享

<?php $previous = null;
    foreach ($dataProvider as $key => $tag) { 
        $firstLetter = strtoupper(substr($tag['name'], 0, 1));
        if($previous !== $firstLetter) { 
            if($key != 0) {
                echo '</ol>';
            }?>
            <h3 class="alpha">
                <span><?php echo $firstLetter;?></span>
            </h3>
            <ol class="tags main">
        <?php } ?>
                <li class="tag">
                    <em><?php echo $tag['TagsCount']; ?></em>
                    <a href="<?php echo $tag['slug']; ?>">
                        <strong><?php echo ucfirst($tag['name']); ?></strong>
                    </a>
                    <span class="perc" style="width: 90px;"></span>
                </li>
        <?php if($key == count($dataProvider)-1) { 
            echo '</ol>';
        }
            $previous = $firstLetter; 
    }
?>

最诚挚的问候www.Forum.iSYSTEMS.am

答案 5 :(得分:0)

正如 Shivansh 在上面的回答中所说,我认为这是正确的方法

$result = array();
foreach ($list as $item) {
    $firstLetter = substr($item, 0, 1);
    $result[$firstLetter][] = $item;
}

echo "<pre>"; print_r($result);

要显示此代码生成的数组,请使用

foreach ( $list as $key => $value ) {
    //Do some thing with $key (A,B,C)
    foreach ($value as $var){
        //Do some thing with $var (Array of A, B ,C)
    }
}