【问题标题】:Jquery Autocomplete multiple PHP Arrays as different categoriesJquery自动完成多个PHP数组作为不同的类别
【发布时间】:2017-10-23 11:54:56
【问题描述】:

我可以成功地使用 php 数组作为自动完成的结果,并且能够单独单击它们。但是,我现在还想使用第二个 PHP 数组并将其作为单独的类别。第一类将是用户名和第二个团队。以下是我的代码:

// query to find usernames for the search bar
  $userSearch = $pdo->prepare("SELECT username FROM members");


  $userSearch->execute([]);

    ($userSearchResult = $userSearch->fetchAll(PDO::FETCH_COLUMN));

// query to find teams for the search bar
  $teamSearch = $pdo->prepare("SELECT teamName FROM teams");


  $teamSearch->execute([]);

    ($teamSearchResult = $teamSearch->fetchAll(PDO::FETCH_COLUMN));

?>

<script type="text/javascript">
    //Assign php generated json to JavaScript variable
   var userSearch = <?php echo json_encode($userSearchResult); ?>;
   var teamSearch = <?php echo json_encode($teamSearchResult); ?>;

    $.widget("custom.catcomplete", $.ui.autocomplete, {
    _renderMenu: function(ul, items) {
        var self = this,
            currentCategory = "";
        $.each(items, function(index, item) {
            if (item.category != currentCategory) {
                ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>");
                currentCategory = item.category;
            }
            self._renderItem(ul, item);
        });
    }
});

$(function() {
    $("#searchBox").catcomplete({
        source: [{"label":userSearch, "category":"username"}, {"label":teamSearch, "category":"teams"}]
    });
});
</script> 

这与我已经完成的工作一样接近。问题是类别显示正确,但结果被列为一个带逗号的长数组。所以而不是:

usernames
   username 1
   username 2
   username 3
teams
   team 1
   team 2
   team 3

我明白了:

usernames 
   username 1,username 2,username 3
teams 
   team 1,team 2,team 3

我希望我在变量中使用 implode 可以对此进行排序,但它从来没有这样做过。

如果我只使用一个变量作为我的源而不使用这样的类别:

source: userSearch

我确实成功获得了用户名列表,这表明:

username 1
username 2
username 3

但这不包含类别或所需的第二个数组。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 为什么要使用implode,已经有json_encode 可用了,呵呵

标签: php jquery arrays autocomplete


【解决方案1】:

万一

<?php echo  implode('","',$userSearchResult); ?> 

您的数组将只有一个元素。

您需要使用json_encode 对数组进行编码:

var userSearch = <?php echo json_encode($userSearchResult); ?>;
var teamSearch = <?php echo json_encode($teamSearchResult); ?>;

根据手册 - 您应该将数据设置为:

var data = [
  { label: "anders", category: "" },
  { label: "andreas", category: "" },
  { label: "antal", category: "" },
  { label: "annhhx10", category: "Products" },
  { label: "annk K12", category: "Products" },
  { label: "annttop C13", category: "Products" },
  { label: "anders andersson", category: "People" },
  { label: "andreas andersson", category: "People" },
  { label: "andreas johnson", category: "People" }
];

所以在你的情况下你需要修改你的 php 数组:

$userSearch = $pdo->prepare("SELECT username FROM members");
$userSearch->execute([]);
$userSearchResult = [];
while ($row = $userSearch->fetch(PDO::FETCH_ASSOC)) {
    $userSearchResult[] = [
        'label' =>  $row['username'],
        'category' =>  "username"
    ];
}
// same to teamnames
$teamSearchResult = [];

$result = array_merge(
    $userSearchResult,
    $teamSearchResult
);

还有javascript:

$("#searchBox").catcomplete({
    source: <?php echo json_encode($result)?>
});

【讨论】:

  • 您使用 json_encode 是正确的,但这并没有改变结果。它们仍然用逗号显示
  • 首先感谢您的出色回答!其次,对不起,我回来了哈哈。我知道这是一个单独的问题,但不是我开始另一个问题,而是我想我会问你,因为你似乎比我知识渊博!列表完美显示。只有我不能用鼠标或键选择一个选项。我已经使用 select: 函数尝试了很多选项,但要知道是否有用。选择:函数(事件,ui){$(“#searchBox”).val(ui.item.label);返回假; } 效果不如我尝试过的其他方法。
  • 我只是快速浏览了文档来回答你的第一个问题,所以我很难说出你的第二个错误的原因是什么。我相信你可以回答一个新问题,希望对你有所帮助)
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 2013-01-18
  • 2013-09-18
  • 1970-01-01
  • 2013-10-21
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多