PHP按字母顺序排序

时间:2010-11-15 18:14:19

标签: php list

我正在尝试制作一个简单的字母顺序列表,以便在我的数据库中订购商品。我无法弄清楚的是如何实际列出它。

我希望它与miniclip.com上的格式相同

这是一张图片

alt text

我环顾四周,但真的找不到答案。

(我希望它能在每个垂直列的末尾完成,除了最后一列之外)

欢迎任何帮助!

9 个答案:

答案 0 :(得分:5)

在MySQL中:

SELECT * FROM table ORDER BY name ASC

在PHP中:

$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
foreach ($fruits as $key => $val) {
    echo "fruits[" . $key . "] = " . $val . "\n";
}
fruits[0] = apple
fruits[1] = banana
fruits[2] = lemon
fruits[3] = orange

答案 1 :(得分:2)

他似乎没有问题,但为每个新信件做列格式和标题。

假设$ arr包含带有数字键的按字母顺序排序的列表。每个元素都有索引'name'和'link'。对于来自SQL查询的数据,这应该是非常安全的假设。

$firstLetter = -1;
$desiredColumns = 4;  //you can change this!
$columnCount = (count($arr)+27)/$desiredColumns+1;
echo "<table><tr><td>";
foreach($arr as $key => $cur)
{
    if ($key != 0 && $key % desiredColumns == 0) echo "</td><td>";
    if ($cur['name'][0] !== $firstLetter)
    {
        echo "<strong>$firstLetter</strong> <br />"; $firstLetter = $cur['name'][0];
    }
    echo "<a href=".$cur['link'].">".$cur['name']."</a><br />";
}
echo "</td><tr></table>";

您必须将数字视为一种特殊情况,但这是个主意。如果你使用模板引擎,显然有更好的方法,但我想你会提到这一点。这是一个粗略的草图,使漂亮的HTML不是我的事。

--Query-- get table into $arr.  I can't see your tables obviously, Im making assumptions if names nad stuff so you'll need to verify or change them

$sql = "SELECT * FROM table T ORDER BY name";
$conn = //you should have this
$res = mysql_query($sql, $conn);
$arr = array();
while($row = mysql_fetch_assc($res)
   $arr[] = $row;
// start above code here.  This isn't safe for empty query responses or other error but it works

答案 2 :(得分:1)

有两种方法可以做到。

您可以使用您的数据库并使用'order'子句按字母顺序将它们拉到特定字段。

您还可以在PHP数组上使用键排序或值排序。

PHP函数是sort($ array)和ksort($ array)。

http://php.net/manual/en/function.sort.php

http://php.net/manual/en/function.ksort.php

<?php
  $list = $your_list_array_from_database
  //if you need info on how to do this, just let me know
  sort($list);

  foreach($list as $item) {
    echo $item;
  }
?>

答案 3 :(得分:1)

我认为您正在使用MySQL(或其他SQL)数据库,在这种情况下,您应该使用查找SELECT上的SORT BY子句以所需顺序检索数据。 (通过sort函数对此PHP进行排序是微不足道的,但让数据库执行此操作是有意义的 - 这几乎就是它的用途。)

在平衡每个列的输出方面,您可以在数据库中获得所需行的COUNT(或者只使用生成的PHP数据数组的计数)并使用它来确保输出是平衡的。

最后想一想,如果要以每页为单位输出,我强烈建议在结构更改时将其生成为静态文件,并将此静态文件作为输出的一部分包含 - 动态生成这些资源是不必要的资源效率低下的。

答案 4 :(得分:1)

上面提到的mysql选项绝对是最好的选择。如果数据按顺序从DM中出来,那么这是最简单的方法。

你的下一个选择可能是看看 PHP中的asort和ksort函数可以找到您正在寻找的确切内容。

http://www.php.net/manual/en/array.sorting.php

你是如何提取数据的?

<?php
$result = mysql_query("SELECT titles FROM gamelist ORDER BY title ASC");
while ($row = mysql_fetch_assoc($result)) {
    echo "{$result['title']}<br/>";
}
?>

答案 5 :(得分:1)

假设您的结果集已经使用ORDER BY子句进行了排序,要按照第一个字符对结果进行分组,您只需记住上一个条目的第一个字符并打印出当前字符的第一个字符如果它们不同则进入。所以:

$prevLabel = null;
while ($row = mysql_fetch_assoc($result)) {
    $currLabel = strtoupper(substr($row['name'], 0, 1));
    if ($currLabel !== $prevLabel) {
        echo $currLabel;
        $prevLabel = $currLabel;
    }
    echo $row['name'];
}

这将打印第一个字符作为每个成员具有相同第一个字符的组的标签。

答案 6 :(得分:1)

我发现这篇文章并遇到了同样的问题。我使用下面的代码按类别名称输出列表,标题等于第一个字母。在我的数据库表(类别)中,我有name和category_letter。所以,name = football和category_list ='F'。

<section>
    <?php
    try {
        $cats_sql = $dbo->prepare("SELECT name, category_list, FROM category WHERE category_list REGEXP '^[A-Z#]' GROUP BY category_list ASC");
        $cats_sql->execute();
        $results_cats = $cats_sql->fetchAll();
    } catch(PDOException $e) {  
        include('basehttp/error');
    }   
    $array_cats = $results_cats;
    if(is_array($array_cats)) {
        foreach($array_cats as $row_cats) {
            $cat_var = $row_cats[category_list]; // Each Category list title
            ?>
            <aside>
            <h1><a name=""><? echo $cat_var ?></a></h1> 
            <?php
            try {
                $search_sql = $dbo->prepare("SELECT name, category_list FROM category WHERE category_list=:cat_var ORDER BY name ASC"); // Pulling a list of names for the category list
                $search_sql->bindParam(":cat_var",$cat_var,PDO::PARAM_STR);
                $search_sql->execute();
                $results_search = $search_sql->fetchAll();
            } catch(PDOException $e) {  
                include('basehttp/error');
            }   
            $array_search = $results_search;
            if(is_array($array_search)) { // Output list of names which match category
                foreach($array_search as $row_search) {
                    ?>
                    <h2><?php echo $row_search[name]; ?></h2>
                    <br class="clear">
                    <?php 
                }
            }
            ?>
            </aside>
            <br class="clear">
            <?php

        }
    }           
    ?>
</section>  

答案 7 :(得分:1)

它实际上很简单......我曾为我的项目做过类似的事情。我不得不取出所有音乐专辑的名称,并按字母顺序对它们进行分类。

在我的表格中,&#34; album_name&#34;是存储名称的列。

$sql= "select * from album_table order by album_name ASC";
$temp_char= ""; // temporary variable, initially blank;

使用while循环,遍历记录;

while($row= $rs->fetch_assoc())
{
$album_name= $row['album_name'];

$first_char_of_albm= $album_name[0]; // this will store first alphabet;

$first_char_of_albm= strtoupper($first_char_of_albm); // make uppercase or lower as per your needs 

if($temp_char!=$first_char_of_albm)
{
    echo $first_char_of_albm;

    $temp_char= $first_char_of_albm; // update $temp_char variable
}

}

那就是......

答案 8 :(得分:0)

我发布了这个旧问题的答案有三个原因:

  1. 您不会像使用Web服务/ API那样将查询写入MySQL或其他DBMS。其他答案都没有解决没有查询操作的PHP排序,同时也解决垂直字母排序
  2. 有时你必须处理关联数组,只有其他几个答案处理assoc。阵列。顺便说一下,我的答案适用于关联数组和索引数组。
  3. 我不想要一个过于复杂的解决方案。
  4. 实际上,我提出的解决方案非常简单 - 在一个巨大的桌子内使用style =&#34; float:left&#34;的多个标签。虽然我怀疑在一个表中有多个tbody标签会传递HTML验证,但实际上确实没有错误。

    有些注意事项:

    • $ numCols 是您想要的列数。
    • 由于我们是浮动项目,您可能需要设置父元素的宽度和最小宽度和/或添加一些&lt; br style =&#34; clear:both&#34; /&gt;,根据您的情况。
    • 有关其他排序方法,请参阅http://php.net/manual/en/array.sorting.php

    这是我的完整答案:

    function sortVertically( $data = array() )
    {
        /* PREPARE data for printing */
        ksort( $data );     // Sort array by key.
        $numCols    = 4;    // Desired number of columns
        $numCells   = is_array($data) ? count($data) : 1 ;
        $numRows    = ceil($numCells / $numCols);
        $extraCells = $numCells % $numCols;  // Store num of tbody's with extra cell
        $i          = 0;    // iterator
        $cCell      = 0;    // num of Cells printed
        $output     = NULL; // initialize 
    
    
        /* START table printing */
        $output     .= '<div>';
        $output     .= '<table>';
    
        foreach( $data as $key => $value )
        {
            if( $i % $numRows === 0 )   // Start a new tbody
            {
                if( $i !== 0 )          // Close prev tbody
                {
                    $extraCells--;
                    if ($extraCells === 0 )
                    {
                        $numRows--;     // No more tbody's with an extra cell
                        $extraCells--;  // Avoid re-reducing numRows
                    }
                    $output .= '</tbody>';
                }
    
                $output .= '<tbody style="float: left;">';
                $i = 0;                 // Reset iterator to 0
            }
            $output .= '<tr>';
                $output .= '<th>'.$key.'</th>';
                $output .= '<td>'.$value.'</td>';
            $output .= '</tr>';
    
            $cCell++;                   // increase cells printed count
            if($cCell == $numCells){    // last cell, close tbody
                $output .= '</tbody>';
            }
    
            $i++;
        }
    
        $output .= '</table>';
        $output .= '</div>';
        return $output;
    }
    

    我希望这段代码对你们所有人都有用。