用php过滤搜索结果

时间:2011-01-28 20:17:56

标签: php arrays search multidimensional-array filter

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

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

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

所以目前当我列出我刚刚按键排序的项目时,首先是最小的,它首先列出产品的最小价格。

但是我希望在此基础上进行构建,以便当用户看到结果时,他们可以选择其他订购选项,例如从下拉框中按名称,某些制造商,颜色,x,y,z等列出所有产品(或类似的东西)

这是我需要一些指导的地方。我只是不确定如何去做或最佳做法或任何事情。我能想到的唯一方法是通过嵌套数组排序所有项目,例如名称,制造商等,但我如何在PHP中执行此操作?

希望你明白我想要实现的目标(如果不是只是问)。对想法,方法或例子的任何帮助都会很棒。

感谢您阅读

p.s Im使用PHP5

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

要进行过滤,请在打印结果之前循环遍历数组,检查字段是否符合条件。

伪代码:

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
}

答案 2 :(得分:0)

使用内存数据库中的小片段更新了示例:) 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很容易受到SQL注入攻击,但是感谢PDO准备好的语句,你不必再担心了。

  

我有一组结果   从多维数组中拉出来。   目前数组键是价格   该项目包含的产品   另一个包含所有的数组   产品详情。

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