我有两个页面,一个HTML页面和PHP页面。HTML包含一个表单,要求用户键入城市名称以及他们希望如何对其进行排序(无、升序或降序)。PHP页面接收输入并包含一个城市数组。我的问题是:如果输入包含字符串的一部分,我如何显示数组中存在的值(使用循环)?例如:如果我搜索"De",它应该会返回底特律和迪尔伯恩,并根据我的选择对它们进行排序。
以下是php代码:
<?php
$sort = substr(filter_input(INPUT_GET, 'sort', FILTER_SANITIZE_STRING),0,4);
$city = substr(filter_input(INPUT_GET, 'city', FILTER_SANITIZE_STRING),0,20);
$cities[0] = "Detroit, Michigan";
$cities[1] = "Rome, Italy";
$cities[2] = "New York, New York";
$cities[3] = "Austin, Texas";
$cities[4] = "Atlanta, Georgia";
$cities[5] = "Dubai, UAE";
$cities[6] = "Shanghai, China";
$cities[7] = "Mumbai, India";
$cities[8] = "Windsor, Canada";
$cities[9] = "Los Angeles, California";
$cities[10] = "Chicago, Illinois";
$cities[11] = "London, England";
$cities[12] = "Dearborn, Michigan";
$cities[13] = "Istanbul, Turkey";
$cities[14] = "Pittsburgh, Pennsylvania";
$cities[15] = "Cincinnati, Ohio";
$cities[16] = "Anaheim, California";
$cities[17] = "Orlando, Florida";
$cities[18] = "Dallas, Texas";
$cities[19] = "Hong Kong, China";
$cities[20] = "Cairo, Egypt";
?>
您可以在数组上循环,并使用PHP strstr函数查找匹配项:
$matches = array();
foreach ($cities as $city) {
if (strstr($city, $search)) {
$matches[] = $city;
}
}
$matches = array_filter(
$cities,
function($value) use ($city) {
return fnmatch('*'.$city.'*', $value, FNM_CASEFOLD);
}
);
编辑
解释。。。array_filter()对数组中的每个值($cities)执行回调,该回调返回一个布尔值true/false,指示是接受还是放弃它。回调使用fnmatch()函数执行通配符比较,将数组条目值与搜索值进行比较;如果值匹配,则返回true;否则返回false。
结果;$matches数组只包含那些符合搜索条件的条目。
演示
如果您希望对结果($matches)进行排序;然后在运行过滤器之后对其进行排序
首先,您可以使用array_filter
过滤您的城市。
$filtered = array_filter($cities, function($current) use ($city) {
// If the current city start with our input, we keep it.
return stripos($current, $city) === 0;
});
其次,您可以根据顺序使用sort
rsort
对您的城市进行排序。
if ($sort === 'ASC') {
sort($filtered);
} elseif ($sort === 'DESC') {
rsort($filtered);
}
然后,您只需要返回经过过滤和排序的结果。