【问题标题】:filtering search results with php用php过滤搜索结果
【发布时间】:2011-06-17 11:42:54
【问题描述】:

真的无法通过谷歌找到任何有用的信息,所以希望这里有一些知识的人可以提供帮助。

我有一组从多维数组中提取的结果。目前,数组键是产品的价格,而商品包含另一个包含所有产品详细信息的数组。

key=>Item(name=>test, foo=>bar)

所以目前当我列出我刚刚订购的商品时,最小的在前,它会首先列出价格最低的产品。

但是我想以此为基础,这样当用户看到结果时,他们可以选择其他订购选项,例如从下拉框中按名称、特定制造商、颜色、x、y、z 等列出所有产品(或类似的东西)

这是我需要一些指导的地方。我只是不确定如何去做或最佳实践或其他任何事情。我能想到的唯一方法是按嵌套数组对所有项目进行排序,例如按名称、制造商等,但我该如何在 PHP 中做到这一点?

希望您了解我想要实现的目标(如果不只是问的话)。任何关于这方面的想法、方法或示例的帮助都会很棒。

感谢阅读

p.s 我使用 PHP5

【问题讨论】:

    标签: php arrays search multidimensional-array filter


    【解决方案1】:

    听起来你不知道自己想要什么。您要过滤还是排序。过滤将仅显示某种类型的事物。排序将按顺序显示某些事物,并且本质上是聚集在一起的。

    对于过滤,循环遍历数组,在打印结果之前,检查您的字段是否符合条件。

    伪代码:

    foreach $results as $result
      if ($result['type']==$filtertype)
       echo $result['name'];
    

    编辑

    对于多维数组的排序,可以使用另一个数组来保存要排序的特定列的键和值,然后在保留键的同时按值排序。然后遍历该数组以按您想要的顺序获取键。并使用排序后的一维数组的键来访问原始结果数组的值。

    foreach ($results as $key=>$data) {
        $sort[$key]=$data['name'];
    }
    asort($sort);
    
    foreach ($sort as $key=>$value) {
        echo $results[$key]['name'];
        echo $results[$key]['category'];
        //etc etc
    }
    

    【讨论】:

    • 感谢您的回复。抱歉,我遇到的问题是根据子数组的值对主数组进行排序。例如:产品 1 子数组的名称为 foo。产品 2 子数组的名称为 bar。产品 3 子数组的名称为 baz。我想按名称订购主数组
    【解决方案2】:

    首先,使用价格作为关键并不是最好的方法;如果两种产品的价格相同,它们将相互覆盖。最好使用唯一键(默认键有效)并将价格也放入子数组中。

    然后就可以使用函数usort对数组进行排序了。

    $array = array(
      array('price' => 1000, 'name' => 'Expensive and useless stuff'),
      array('price' => 2.3, 'name' => 'Cheap and useful stuff')
    );
    $sortby = 'price'; // or name, in this example
    $code = 'if($product1["'.$sortby.'"] == $product2["'.$sortby.'"]) return 0; return ($func_a < $func_b) ? -1 : 1;';
    usort($array, create_function('$product1,$product2', $code));
    

    来源/更多信息:http://us.php.net/manual/en/function.usort.php

    【讨论】:

    • 你的价格是对的。因为当时我不确定如何进行排序,所以我最终为每个键添加了一个非常非常小的数值以使其唯一(我敢打赌这是不好的做法)!!
    【解决方案3】:

    在内存数据库中使用一点 sn-p 更新示例 :) P.S:本例中的 XSS 保护根本不需要,因为我将输入检查为布尔值。要以相反的顺序查看结果,请指定 order?desc

    <?php
    
    /* XSS-protection. */
    $_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
    
    $array = array(
        "ActionScript",
        "AppleScript",
        "Asp",
        "BASIC",
        "C",
        "C++",
        "Clojure",
        "COBOL",
        "ColdFusion",
        "Erlang",
        "Fortran",
        "Groovy",
        "Haskell",
        "Java",
        "JavaScript",
        "Lisp",
        "Perl",
        "PHP",
        "Python",
        "Ruby",
        "Scala",
        "Scheme"
    );
    
    function createTable($db) {
        $db->exec("CREATE TABLE IF NOT EXISTS tags (id INTEGER PRIMARY KEY, tag TEXT NOT NULL UNIQUE)");
    }
    
    function insertData($db, $array) {
        $db->beginTransaction();
    
        foreach($array as $elm) {
            try {
                $stmt = $db->prepare("INSERT INTO tags (tag) VALUES (:tag)");
                $stmt->execute(array(
                    ":tag" => $elm
                ));
            } catch(PDOException $e) {
                /*** roll back the transaction if we fail ***/
                $db->rollback();
                /*** echo the sql statement and error message ***/
                echo $sql . '<br />' . $e->getMessage();
            }
        }
    
        $db->commit();
    }
    
    $db = new PDO('sqlite::memory:');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
    //
    createTable($db);
    insertData($db, $array);
    
    $order = "ASC";
    if (strtoupper($_GET['order']) == "DESC") {
        $order = "DESC";
    }
    
    $stmt = $db->prepare("SELECT * FROM tags ORDER BY tag $order");
    $stmt->execute();
    
    $data = array();
    while($row = $stmt->fetch()) {  
        $data[] = array($row['tag']);
    }
    
    echo json_encode($data);
    

    希望你明白我想要做什么 实现(如果不只是问)。任何帮助 这与想法、方法或 例子会很棒。

    首先我有几个问题,你说你正在使用 PHP5。你如何检索你的数据(RDBMS)?如果没有,PHP5 有SQLite enabled by default。我认为您至少应该使用RDBMS(SQLite/etc) 来为您完成繁重的工作。

    当您learn SQL 时,您不必在 PHP 中进行任何排序。我认为这个PDO tutorial 让您了解如何在安全地使用 SQL 的同时使用它。 SQL 容易受到 SQL 注入的影响,但由于 PDO 的预处理语句,您不必再担心这一点。

    我有一组结果是 从多维数组中提取。 目前数组键是价格 产品,而该项目包含 另一个包含所有 产品详情。

    使用ORDER BY 订购。我会使用数据表在客户端进行排序。还可以保护您在服务器(PHP)上工作。例如,您可以查看YUI2's datatable

    【讨论】:

    • 感谢您的回复。是的,我认为使用数据库会很好,但我正在从 XML 源中检索实时数据。感谢 PDO tut,这听起来很有趣!不确定我是否可以使用 YUI2 数据表,因为结果是分页的。非常感谢您的意见:)
    • @fl3x7 没问题我认为你可以使用 YUI2 数据表(它真的很强大。你应该看看所有的例子)。甚至还有带有分页结果的示例 => developer.yahoo.com/yui/examples/datatable/dt_dynamicdata.html。我想指出很多人不知道的其他事情。您可以将 SQLite 数据库用作内存数据库;)。我将尽快更新我的答案以进行简短的介绍。
    • @fl3x7 感谢new PDO('sqlite::memory:');,我使用内存数据库中的示例更新了答案
    • p.s:如果您愿意,可以在stackoverflow.speeqe.com 上与我聊天以获取更多信息:P
    • 感谢内存示例。我从来没有新的你能做到这一点!现在打算玩一玩。如果我有任何问题,我会去聊天。再次感谢队友:)
    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多