我想按字母顺序排列第一个字母对自动填充建议进行排序。
现在看起来像这样:http://i.imgur.com/EevFyv2.png
如果我输入字母C,我想显示这样的标签建议:
代码:
$text = $mysqli->real_escape_string($_GET['term']);
$query = "SELECT * FROM autocomplete WHERE name LIKE '%$text%' ORDER BY name ASC";
$result = $mysqli->query($query);
$json = '[';
$first = true;
while($row = $result->fetch_assoc())
{
if (!$first) { $json .= ','; } else { $first = false; }
$json .= '{"value":"'.$row['name'].'"}';
}
$json .= ']';
echo $json;
我希望有人可以提前帮助。
答案 0 :(得分:6)
你需要
SELECT *
FROM autocomplete
WHERE name LIKE '%$text%'
ORDER BY (name LIKE '$text%') DESC,
name ASC
第一个ORDER BY子句是BOOLEAN值,当名称以1
开头时为$text
,否则为0
,因此当您按DESC
顺序排序时,以$text
开头的值将移动到列表的前面(而那些仅包含在其他位置的值将移动到末尾)。然后第二个子句再次按字母顺序对“子列表”进行排序。
答案 1 :(得分:1)
更新。由于您似乎需要以输入的前缀开头的建议首先出现在列表中,因此您需要使用用户排序功能。我已更新代码以匹配此内容。
如果要在PHP中进行排序,则需要创建一个包含结果的数组,并通过PHP array sorting function对其进行排序。以下是使用usort()
函数修改后的代码:
$term = $_GET['term'];
$text = $mysqli->real_escape_string($term);
$query = "SELECT * FROM autocomplete WHERE name LIKE '%$text%' ORDER BY name ASC";
$result = $mysqli->query($query);
$results = array();
while($row = $result->fetch_assoc())
{
$results[] = $row['name'];
}
usort($results, function($item1, $item2) use($term) {
// prefixed items need to go first
$item1HasPrefix = strpos($item1, $term) === 0;
$item2HasPrefix = strpos($item2, $term) === 0;
if($item1HasPrefix && $item2HasPrefix) {
// if both items have the prefix, sort them
return strcmp($item1, $item2);
} elseif($item1HasPrefix) {
return -1;
} elseif($item2HasPrefix) {
return 1;
} else {
return strcmp($item1, $item2);
}
});
echo json_encode($results);
答案 2 :(得分:-1)
您可以在客户端尝试 bootstrap-typeahead JS自动填充库。