我目前在分割 PHP 变量中存储的字符串时遇到问题。
我有一个网站和一个 php 脚本,它从数据库字段中获取一个字符串(4-6 个单词,例如雷丁大学),将其存储在变量中并将其显示在屏幕上。它循环数据库并输出许多不同的字符串。
字符串包含大学名称,例如布鲁内尔大学、雷丁大学等 php 脚本按字母顺序显示大学名称。显然它首先读的是“University of...”,因此对许多大学进行了错误的排序。
例如清单:
Brunel University
University of Reading
University of Birmingham
Cardiff University
University of Essex
目前排序如下:
Brunel University
Cardiff University
University of Birmingham
University of Essex
University of Reading
而它应该排序为:
Birmingham, University of
Brunel University
Cardiff University
Essex, University of
Reading, University of
我需要在显示每个字符串之前搜索它是否包含“University of”一词,如果包含,我需要删除这些单词并将它们放在字符串的末尾。然后我需要显示该字符串。
我希望这是有道理的,如果有人可以建议我如何做到这一点,我将不胜感激。
编辑
我正在使用的代码如下。我想我可能需要在某个地方使用“爆炸”功能?
<tr>
<td><table class="flat-table flat-table-2" width="100%">
<tr>
</tr>
<tr style="background-color:#FFF;">
<td class="table-head">Name</td>
<td class="table-head">Average Hall Rating</td>
</tr>
<?php
//run a query to find all the fields in the hall table that belong to the specific university, using the id in the url ($current_id)
if ($s = $db->prepare("SELECT * FROM university ORDER BY name ASC")) {
$s->execute(); // Execute the prepared query.
//search table for all fields and save them in $hall
$unitemp = $s->fetchAll();
foreach( $unitemp as $uni) {
//store each halls id
$uni_id = "university.php?id=$uni[id]";
//loop and output hall names below
?>
<tr>
<td><? echo $uni['name'];?></td>
<td><? echo $uni['rating']; }}?></td>
</tr>
</table>
</td>
</tr>
</table>
我更新了代码中的一些行:
<?php
//run a query to find all the fields in the hall table that belong to the specific university, using the id in the url ($current_id)
if ($s = $db->prepare("SELECT * FROM university ORDER BY name ASC")) {
$s->execute(); // Execute the prepared query.
//search table for all fields and save them in $hall
$unitemp = $s->fetchAll();
foreach( $unitemp as $uni) {
$pieces = explode("of", $uni['name']);
if(count($pieces)>1)
$response = $pieces[1].", ".$pieces[1]." of";
else
$response = $pieces[0];
echo $response;
}
看一眼,您似乎想要创建一个更新的列表,其中大学名称列为
Reading, University
,以 University
开头的大学。您需要循环遍历您的列表,生成一个新的列表来执行此操作。
$universities = $UNIVERSITY_LIST_HERE
$uniNames[];
foreach ($unversities as $uni){
$uniStr = substr($uni, 0, 12);
if($uniStr == "University of"){
// split the string
$uniNames[] = substr($uni, 13) . ', ' . $uniStr;
} else {
$uniNames[] = $uni;
}
}
然后您可以将
$uniNames
传递到排序算法中。 PHP 有一个很好的 sort();
算法可供您使用。下面,我打印出 foreach 循环内的名称。
sort($uniNames);
foreach ($uniNames as $key => $val) {
echo "uniNames[" . $key . "] = " . $val . "\n";
}
从您的示例数据来看,很明显,您只需要在清理不需要的单词后按名称值排序即可。 您无需费心进行
prepare()
调用,因为您没有向 SQL 查询中注入任何变量。
MySQL 实现:(PHPize 演示)
$sql = <<<SQL
SELECT *
FROM university
ORDER BY REGEXP_REPLACE(name, ' ?University(?: of)? ?', '')
SQL;
foreach ($mysqli->query($sql) as $row) {
echo "<div>{$row['name']}</div>\n";
}
如果您有兴趣通过 PHP 进行排序(出于某种未知原因),请调用
array_multisort()
并将经过清理的列值的平面数组作为第一个参数传递,以便结果集的行在第二个参数中排序。
代码:(PHPize演示)
$result = $mysqli->query('SELECT * FROM university')->fetch_all(MYSQLI_ASSOC);
array_multisort(
preg_replace('/ ?University(?: of)? ?/', '', array_column($result, 'name')),
$result
);
foreach ($result as $row) {
echo "<div>{$row['name']}</div>\n";
}