按字母顺序排列首字母排序自动填充建议

时间:2015-04-24 08:36:40

标签: php mysql

我想按字母顺序排列第一个字母对自动填充建议进行排序。

现在看起来像这样:http://i.imgur.com/EevFyv2.png

如果我输入字母C,我想显示这样的标签建议:

  • C
  • C ++
  • Active Directory
  • Apple脚本
  • BlueCoat公司

代码:

$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;

我希望有人可以提前帮助。

3 个答案:

答案 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自动填充库。

https://twitter.github.io/typeahead.js/examples/