检查数组是否包含与值匹配的数组,然后将结果存储到新数组中

时间:2019-01-11 11:32:48

标签: php arrays

我有一个奇怪的问题,无法在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”。

我希望以上内容是可以理解的,否则请告诉我如何加以改进。

亲切的问候, 罗伯特

2 个答案:

答案 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']));