0

这是我的查询:

try
{
  $sql = 'SELECT park_id, name, town, state, country
          FROM tpf_parks wHERE  ORDER BY name ASC';
  $result = $pdo->query($sql);
}
catch (PDOException $e)
{
  $error = 'Error fetching parks: ' . $e->getMessage();
  //include 'error.html.php';//
  exit();
}

$output = 'Parks Loaded';
//include 'output.html.php';//

foreach ($result as $row)
{
  $parklist[] = array(
    'park_id' => $row['park_id'],
    'name' => $row['name'],
    'town' => $row['town'],
    'state' => $row['state'],
    'country' => $row['country']
  );
}
include 'parks.html.php';

这是parks.html.php

<?php foreach ($parklist as $park):?>
    <a href="park.php?park_id=<?php echo $park['park_id'];?>">
        <h2><?php echo $park['name'];?></h2>
        <h3><?php echo $park['town'],',',$park['state'],',',$park['country'];?></h3>
    </a>
    <hr>
<?php endforeach; ?>

我正在寻找可以更改 foreach 循环的某种方式,以便我可以将结果分成按第一个字母排序的组。这样我就可以为每个 Letter 放置一个 html 锚点,使用户可以通过单击页面顶部的链接(ABCDE 等)更轻松地找到特定记录。我不知道如何实现这一目标。

4

2 回答 2

0

好吧,除非您使用变量 variables ,否则它不会是最漂亮的解决方案,这将允许您创建数组并基于带有字母数组的循环分配它们。

但是,如果这对您来说太复杂了,只需执行以下操作:

$a = array();
$b = array();
$c = array();
...

foreach ($result as $row)
{
    $letter = strtolower(substr($row['name'], 0, 1));
    if ($letter == 'a') $a.push($row);
    else if($letter == 'b') $b.push($row);
    ...
}

显然,对每个字母都重复。

然后,当您循环遍历数组以创建 html 时,您必须对每个字母数组执行 foreach()。

于 2013-04-05T23:06:39.310 回答
0
foreach ($result as $row)
{
   //add to sub-array with first letter of $row['name']
   $parklist[strtolower($row['name'][0]][] = array(
   ....


//rather then give the whole alphabet with possible empties, check for existing letters:
$letters = array_keys($parklist)

或者,为了多字节环境中的安全(例如 utf-8):

   $parklist[mb_strtolower(mb_substr($row['name'],0,1))][]= array(

(假设你有一个正确的mb_internal_encoding()

如果您希望变音符号解决他们的基础(ö例如o);

    $parklist[iconv('whateveryourinputcharsetis','ASCII//TRANSLIT',mb_strtolower(mb_substr($row['name'],0,1)))][]= array(

请注意,您按名称列排序MySQL因此您的条目应该按顺序排列,前提是您有正确的COLLATION

正确的字符集/排序规则:

mysql> CREATE TABLE t ( f char(1)) charset=utf8;
Query OK, 0 rows affected (0.25 sec)
mysql> show full columns from t;
+-------+---------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type    | Collation       | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+---------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| f     | char(1) | utf8_general_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-------+---------+-----------------+------+-----+---------+-------+---------------------------------+---------
mysql> INSERT INTO t VALUES ('a'),('p'),('ä'),('o'),('ñ'),('ò');
Query OK, 6 rows affected (0.09 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t ORDER BY f;
+------+
| f    |
+------+
| a    |
| ä    |
| ñ    |
| o    |
| ò    |
| p    |
+------+
6 rows in set (0.00 sec)

但错误造成了严重破坏:

mysql> SELECT * FROM t ORDER BY CONVERT(f USING ascii);
+------+
| f    |
+------+
| ä    |
| ñ    |
| ò    |
| a    |
| o    |
| p    |
+------+
6 rows in set (0.00 sec)
于 2013-04-05T23:07:17.473 回答