我应该如何在php

时间:2015-06-26 21:15:46

标签: php arrays search

我有一个下面列出的标准多维数组,它将容纳我的客户常见问题解答文章。这些文章将包括每篇文章的标题,描述和各种标签。我正在尝试在我的网站上设置一个表单,访问者可以在其中搜索阵列中的任何内容。如果匹配,网站将返回与搜索到的标记匹配的文章。

我的问题。

  1. 这是提供常见问题搜索的最佳方式,还是我应该关注 在用javascript和json做某事的事情?
  2. 我应该如何搜索数组并确定正确的数据 包含访问者搜索的标记的文章?
  3. 这是我的阵列。

    function get_articles_all() {
    
    $articles = array();
    
    $articles[0] = array(
    
        "title" => "What port does the Cisco TSP use?",
        "body" => "TAPI talks to the TAPI Service Provider (TSP) and the TSP talks to the CTI manager through port 2748.",
        "tag" => array("port","cisco")
    
        );
    
    $articles[1] = array(
    
        "title" => "Title of second article.",
        "body" => "Body of second article. Body of second article. Body of second article. Body of second article. Body of second article. Body of second article. Body of second article. Rocky.",
        "tag" => array("second","number2")
    
        );
    
    $articles[2] = array(
    
        "title" => "Title of third article.",
        "body" => "Body of third article. Body of third article. Body of third article. Body of third article. Body of third article. Body of third article. Body of third article. Rocky.",
        "tag" => array("third","number3")
    
        );
    
    return $articles;
    
    }
    

    这是我的搜索功能。

    function article_tag_search($t) {
      $tagResults = array();
      $all = get_articles_all();
    
      foreach ($all as $article => $key) {
    
            if (stripos($key,$t) !== false) {
                $tagResults[] = $article;
           }
    
      }
      return $tagResults;
    }   
    

    以下是我用来测试代码的内容。

     $test = article_tag_search("port");
    
     echo '<pre>';
     print_r($test);
     echo '</pre>';
    

    会产生以下输出。

     Array
     (
       [0] => 0
       [1] => 1
       [2] => 2
     )
    

    非常感谢任何协助。

    达斯汀

1 个答案:

答案 0 :(得分:0)

您的常见问题是多页吗? (例如,每个问题在不同页面上都有一个(相当长的)答案)如果是这样,那么使用您当前正在使用的解决方案应该没问题。虽然从用户体验的角度来看,我会欣赏一个页面,其中所有问题都列在另一个下面,以及用于过滤列表的搜索输入(使用Javascript)。

如果您的常见问题解答内容不是太多,您可以通过一次AJAX调用加载它们,否则您可以“限制”#c;&#39;请求并逐渐加载它们(例如Facebook,如果我没记错的话,设置最多25个帖子一次从公共页面检索)。

关于问题2,我认为更好(更便携)的解决方案是:

function get_items_by($prop, $value) {
    global $articles;
    $result = array();
    for ($i = 0; $i < count($articles); $i++) {
        // below split in else if just for readability
        if (is_array($articles[$i][$prop]) && in_array($value, $articles[$i][$prop]))
            array_push($result, $i);
        else if (is_string($articles[$i][$prop]) && strpos($articles[$i][$prop], $value) > -1)
            array_push($result, $i);            
    }
    return $result;
}

上面的函数将返回$prop是(1)数组并且其中的值与$value匹配的任何数组项的索引,或者(2){找到{1}}。 像这样使用:

$value

当然要注意,如果例如搜索部分标记也应该返回结果,则该函数需要一些自定义。

除了返回索引之外,您还可以返回项目(get_items_by('tag', 'port'); // returns [0] get_items_by('body', 'Body of'); // returns [1,2] ),并在用户点击搜索按钮/输入时使用AJAX更新列表。 jQuery的一个例子:

(JS)

array_push($result, $articles[$i])

(PHP处理程序文件)

$('#search-button').on('click', function() {
   var searchFor = $('#search-field').val();
   $.ajax({
     url: "your/PHPFile.php",
     data: {search: searchFor}
   }).done(function(data) {
     var data = $.parseJSON(data);
     $.each(data, function(item) {
       // here you have access to each article's title, body, etc.. for output
     });
   });
});