我有一个奇怪的问题,无法在Google或SO上找到答案。
我有一个数组,其中包含有关我网站上页面的所有信息。因此,该数组包含多个数组,如下例所示:
'home' =>
array (size=7)
'title' => string '' (length=0)
'url' => string 'home.php' (length=8)
'mobile' => string 'home.php' (length=8)
'keywords' => string '' (length=0)
'description' => string 'test123' (length=126)
'login_needed' => boolean false
'original_page' => string 'home' (length=4)
我需要做的是找到每个包含来自搜索栏的值的数组。例如,如果用户搜索“ bruidsmode”,则每个包含“ bruidsmode”的数组都应放入另一个数组,然后我可以将其输出为要显示在网站上的元素。
在下面,您将找到我的页面上已剥离的示例。 (我尝试制作一个有效的示例,但未能做到):
<?php
$config['menu']["home"] = array (
'title' => '',
'url' => 'home.php',
'mobile' => 'home.php',
'keywords' => '',
'description' => '',
'login_needed' => FALSE
);
$config['menu']["bruidsmode"] = array (
'title' => '',
'url' => 'bruidsmode.php',
// 'mobile' => 'bruidsmode.php',
// 'mobile' => 'bruidsmode.php',
'keywords' => '',
'description' => '',
'login_needed' => TRUE,
'robot' => FALSE
);
if(isset($_POST['generalsearch']) && isset($_POST['generalsearchresult'])){
// Put search value into variable
$searchvalue = $_POST['generalsearchresult'];
// Fill variable with all page items
$array = $config['menu'];
// Set search cretaria to search in array
$key = $searchvalue;
// Search for key value inside array
$result = @$array[$key] ?: null;
if($result == null){
echo "Geen resultaten gevonden...";
}else{
var_dump($result);
}
}
?>
<form method="POST">
<input type="text" name="generalsearchresult">
<input type="submit" name="generalsearch">
</form>
上面的代码有效,但仅输出与搜索条件完全匹配的数组。因此,例如带有上述代码的搜索词“ bruidsmode”仅输出页面“ bruidsmode”,而不输出页面“ bruidsmode-overzicht”。
我希望以上内容是可以理解的,否则请告诉我如何加以改进。
亲切的问候, 罗伯特
答案 0 :(得分:1)
您的代码并不是我真正所谓的搜索。为了进行搜索,您应该遍历数组以查找潜在的匹配项,而不是返回请求的属性。
function searchMenu($menu, $term) {
$matches = [];
foreach($menu as $key => $value) {
if (stripos($key, $term) !== false) {
$matches[] = $value;
}
}
return $matches;
}
if(isset($_POST['generalsearch']) && isset($_POST['generalsearchresult'])){
$result = searchMenu($config['menu'], $_POST['generalsearchresult']);
if(!count($result)){
echo "Geen resultaten gevonden...";
}else{
var_dump($result);
}
}
答案 1 :(得分:0)
如果要返回多个结果,则需要将它们存储在数组中并返回。
如果要执行此操作,则可以扩展搜索范围,以检查子字段,而不仅限于顶级键:
$page_data =[
'my-cat' => [
'title' => '',
'url' => 'my-cat.php',
'mobile' => 'my-cat.php',
'keywords' => 'cat,kitten',
'description' => 'i love my cat',
'login_needed' => false,
'original_page' => 'mycat',
],
'home' => [
'title' => '',
'url' => 'home.php',
'mobile' => 'home.php',
'keywords' => 'cat,dog,other',
'description' => 'a site about cats',
'login_needed' => false,
'original_page' => 'home',
],
'about' => [
'title' => '',
'url' => 'about.php',
'mobile' => 'about.php',
'keywords' => 'about',
'description' => 'about me',
'login_needed' => false,
'original_page' => 'about',
],
];
function search(array $page_data_to_search, string $search_term, array $fields_to_search): array{
$out=[];
$search_fields = array_flip($fields_to_search); //O(1)
foreach($page_data_to_search as $key => $page_data){
//first test the key
if(isset($search_fields['key']) && strpos($key, $search_term) !==false){
$out[$key]=$page_data;
continue; //no need to check other fields
}
//then the user supplied fields
foreach($search_fields as $field => $unused){
if(isset($page_data[$field]) && strpos($page_data[$field], $search_term) !==false){
$out[$key]=$page_data;
break;
}
}
}
return $out;
}
echo '<pre>';
var_dump(search($page_data, 'cat', ['key', 'keywords', 'description']));