我正在尝试设置for循环来打印以某个字母开头的数据库表中的所有数据。例如,假设从数据库中的所有用户名,我只想打印以字母“b”开头的每个用户名。我想达到的最终结果是:
A
adam
angel
apple
B
ball
bear
blue
C
car
cell
chris
#
0wen
1uis
3than
.,_
.apple.
,car,
_jeff_
我希望能够在它们开头的相应字符下打印所有用户名。我在标题标签下有起始字符,所以我真正需要的是打印它们下面的用户名。我想在每个标题标签下运行一个简单的for循环,过滤那些数据就可以解决这个问题,但是对于我的生活,我无法弄清楚如何去做。到目前为止我的代码(我知道这将打印表中的每个用户):
require_once 'important/connect.php';
$query = $link->prepare('select distinct usr from info order by usr');
$query->execute();
$users = $query->fetchAll(PDO::FETCH_OBJ);
foreach ($users as $user)
{
print "<center><a href=\"log.php?id={$user->usr}\" onclick=\"return popUp(this.href)\">{$user->usr}</a></center>";
}
以上代码仅用于展示我正在使用的内容。我正在拍摄以保持每个用户名都作为网址打印,所以当点击用户名时,它会在单独的弹出窗口中显示更多信息,但我已经有了这个工作。无论如何,我将如何实现这一点,或者我想要的方式是不可能的?
答案 0 :(得分:3)
对于循环,您可以使用此PHP语法:
foreach(range('A','Z') as $letter) {
//your own code
}
范围会让你像通常使用foreach那样遍历字母。
关于你的问题的一点是关于表现。
如果要返回少量数据,则可以返回整个数组,然后使用php函数进行搜索,以仅操作数组以$letter
开头的项目。
如果你有很多项目,最好使用mysql指令LIKE为每个字母运行查询(恕我直言)(因为这会提高性能):
"SELECT usr FROM info WHERE usr LIKE '$letter%' ORDER BY usr GROUP BY usr"
LIKE将只匹配那些以$ letter开头并且还有其他内容的usr。 %是要使用的通配符。
另请注意,在查询中,我使用GROUP BY usr
代替SELECT DISTINCT usr
来获得相同的结果,因为这是获取唯一用户列表的正确方法。
答案 1 :(得分:1)
正如Lelio Faieta指出的那样,一遍又一遍地遍历用户列表可能对性能不利。但是,一遍又一遍地查询数据库也可能不好。
所以我建议只让用户使用一次,然后按照正确的顺序获取用户:
SELECT usr FROM info ORDER BY usr GROUP BY usr
然后循环浏览它们,并跟踪你所在的起始字母:
$oldLetter = '';
$newLetter = '';
foreach ($users as $user)
{
$newLetter = strtoupper(substr($user->usr, 0, 1));
if($oldLetter != $newLetter)
{
//We are on a new letter.
//Print a heading for all letters between the old one and the new one.
foreach(range(++$oldLetter, $newLetter) as $letter)
print '<h2>' . $letter . '</h2>';
$oldLetter = $newLetter;
}
//Print the user, as before.
print "<center><a href=\"log.php?id={$user->usr}\" onclick=\"return popUp(this.href)\">{$user->usr}</a></center>";
}
这不会照顾最后一组(在您的示例中标题为#
)。为此,您需要检查第一个字符是否是SQL中的字母,并以某种方式对其进行排序。
请注意,此代码不支持复制粘贴,您需要对其进行一些操作。例如,如果旧信是Z
,则可能存在一些问题。我没有测试过这个,所以你应该在投入生产之前。
答案 2 :(得分:0)
令人讨厌的解决方案的伪代码:
$alphabetArray = array("A","B", etc);
foreach($alphabetArray as $letter) {
echo '<h2>'.$letter.'</h2>';
$sql = "SELECT * FROM `usertable` WHERE `username` = '".$letter."%' ORDER BY `username` ASC;"
// execute sql, loop through and output results
}