簡體   English   中英

從數組中打印字母導航列表

[英]Print alphabetical navigation list from an array

我有一系列項目,我正在嘗試為它們生成字母導航。

A | B | C | D | E | F | G | H等......

  • 蘋果
  • 胡蘿卜
  • 駱駝

所以我想列出字母表中的每個字母,但只鏈接數組中具有匹配項的字母。

到目前為止,我有:

$productArr = array('Apple','Apricot','Carrot','Camel','Dog');

$previous = null;
foreach(range('A','Z') as $alpha) {
    $arrayCount = count($productArr);
    for ($i=0; $i < $arrayCount; $i++) {
        $firstLetter    = $productArr[$i];
        if ($firstLetter[0] == $alpha && $firstLetter[0] != $previous){
            echo '<li><a href="#'.$alpha.'">'.$alpha.'</a></li>';
            $previous = $alpha;
        }elseif ($firstLetter[0] != $alpha && $alpha != $previous){
            echo '<li>'.$alpha.'</li>';
            $previous = $alpha;
        }
    }       
}

它工作正常,直到elseif ,如果你注釋掉else,它會按預期打印鏈接列表。 只需要弄清楚如何打印其余的字母表。

任何有關我出錯的地方的幫助將不勝感激。

干杯

您需要一個額外的步驟來首先對產品進行分組。

    $productArr = array('Apple','Apricot','Carrot','Camel','Dog');

    //This is the extra step
    $productArrGroup = array();
    foreach($productArr as $product){
        if(!isset($productArrGroup[$product[0]])){
            $productArrGroup[$product[0]] = array();
        }
        $productArrGroup[$product[0]][] = $product;
    }

    //You can even print the number of matching product for each $alpha like this !
    foreach(range('A','Z') as $alpha) {
        if(array_key_exists($alpha, $productArrGroup)){
            echo '<li><a href="#'.$alpha.'">'.$alpha.' ('.count($productArrGroup[$alpha]).')</a></li>'."\n";
        }else{
            echo '<li>'.$alpha.'</li>'."\n";
        }
    }

上面代碼的結果

<li><a href="#A">A(2)</a></li>
<li>B</li>
<li><a href="#C">C(2)</a></li>
<li><a href="#D">D(1)</a></li>
<li>E</li>
<li>F</li>
<li>G</li>
<li>H</li>
<li>I</li>
<li>J</li>
<li>K</li>
<li>L</li>
<li>M</li>
<li>N</li>
<li>O</li>
<li>P</li>
<li>Q</li>
<li>R</li>
<li>S</li>
<li>T</li>
<li>U</li>
<li>V</li>
<li>W</li>
<li>X</li>
<li>Y</li>
<li>Z</li>

注意:您可能希望不區分地匹配字母,在這種情況下,您可以使用strtoupper函數來$ product [0]

我認為秘訣是將elseif移出內循環。

<?php
$productArr = array('Apple','Apricot','Carrot','Camel','Dog', 'Rabbbit');

$previous = null;
foreach(range('A','Z') as $alpha) {
    $arrayCount = count($productArr);
    $printed = false;
    for ($i=0; $i < $arrayCount; $i++) {
        $firstLetter    = $productArr[$i];
        if ($firstLetter[0] == $alpha && $firstLetter[0] != $previous){
            echo '<li><a href="#'.$alpha.'">'.$alpha.'</a></li>';
            $previous = $alpha;
            $printed = true;
        } 
    }
    if($printed == false){
         echo '<li>'.$alpha.'</li>';
    }
}
?>

你的elseif應該是|| 不是&&

elseif ($firstLetter[0] == $alpha && $alpha != $previous){

DEMO http://phpfiddle.org/main/code/i2q-97d

請檢查這可能有用

<?php
// define indexed array
$animals = array("wolf", "lion", "tiger", "iguana", "bear","zebra", "leopard");
// sort alphabetically by value
// result: ("bear", "iguana", "leopard", "lion", "tiger", "wolf","zebra")
sort($animals);
print_r($animals);
?>

還有這個 :

$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";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM