2011-10-12 43 views
6

Tôi có một mảng mà đã có chứa tất cả các giá trị của nó trong thứ tự chữ cái:Làm thế nào để hiển thị một mảng dưới các chữ cái theo thứ tự chữ cái bằng cách sử dụng PHP?

Alligator 
Alpha 
Bear 
Bees 
Banana 
Cat 
Cougar 

Bây giờ tôi chỉ muốn liệt kê các chữ cái đầu tiên mỗi bắt đầu với trên nó như vậy:

A 
--- 

Alligator 
Alpha 

B 
--- 

Bear 
Bees 
Banana 

C 
--- 

Cat 
Cougar 

etc... 

thế nào có thể này được làm?

Trả lời

22

Giải pháp là để giữ trong một biến chữ cái đầu tiên của từ được in trước đó, như:

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

NB: nếu một số mục bắt đầu bằng chữ cái chữ thường và những người khác với thượng chữ hoa chữ thường, sử dụng hàm strcasecmp trong thử nghiệm thay vì !==.

+0

Cảm ơn cho giải pháp này! Nó đã giúp tôi tối nay. – Steve

0

Lặp lại qua mảng và kiểm tra xem mục hiện tại có bắt đầu bằng một chữ cái khác với ký tự trước đó không. Nếu đó là trường hợp in "A ---" của bạn.

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

Tôi có ba giải pháp. 1) Tạo một mảng khác chứa tất cả các bảng chữ cái. Sau đó, sử dụng foreach để lặp qua mảng này. Và trong kiểm tra forested lồng nhau cho sự xuất hiện của lá thư đó thông qua phương pháp strpos của php. Đây là mã thô.

<?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) phương thức thứ hai có cùng logic như trên. Nhưng ở đây bạn không cần phải tạo mảng cho bảng chữ cái. Bạn có thể nhận được tất cả các bảng chữ cái theo cách này.

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

Php range method

3) Giải pháp thứ ba cũng có cùng một logic như trên hai. Ở đây bạn có thể nhận được bảng chữ cái bằng cách khác :)

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

đây là một giải pháp đơn giản: -

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

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

Output: -

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

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

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

Đối với đầu ra 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 --> 

Tôi thay đổi mã Artefact2 và chia sẻ cho y ou

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

Trân trọng www.Forum.iSYSTEMS.am

Các vấn đề liên quan