2013-08-23 39 views
0

我有一個項目數組,我試圖爲它們生成一個按字母順序的導航。從數組中打印字母導航列表

A | B | C | d |電子| 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,如果你註釋掉ELSEIF它打印的鏈接列表預期。只需要弄清楚如何打印字母表的其餘部分。

任何幫助,我要去哪裏錯將不勝感激。

乾杯

+0

所以我想列出字母表中的每個字母,但只鏈接具有匹配的項目在數組意味着你要鏈接只有中開始,數組值alphabet.Correct我,如果我是這些字母的那些錯誤。 –

回答

1

我認爲祕密是將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>'; 
    } 
} 
?> 
+0

工作就像一個魅力! – StefWill

0

elseif||&&

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

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

+0

這打印每個字母5次! –

+0

編輯我的答案 – Vector

+0

,但我們要打印所有的字母....並只鏈接那些是陣列中的第一個chacaters ....你的答案只打印出陣列中的那些..如果我錯了,請更正我 –

0

請檢查這可能是有用的

<?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"; 
} 
1

您需要一個額外的步驟先將產品分組。

$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功能$產品[0]

+0

完美答案... –