2011-01-28 180 views
0

无法通过Google真的找到任何有用的信息,所以希望有人在这里有一些知识可以帮助。我有一组从多维数组中拉出的结果。目前,数组键是产品的价格,而该项目包含另一个包含所有产品细节的数组。使用php过滤搜索结果

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

所以目前当我列出的项目,我只是按键排序,最小的第一个,它列出了产品最低的价格第一。

不过,我想在此建,这样当用户看到的结果,他们可以从下拉框中选择一个名字,某些生产厂家,颜色,X,Y,Z等等等等其他排序选项,如列表中的所有产品(或类似的东西)

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

希望你明白什么即时通讯试图实现(如果不只是问)。任何关于这个想法,方法或例子的帮助都会很棒。

感谢您使用PHP5

回答

0

更新例如使用内存数据库中的小片段:) PS:是不是需要在所有因为我检查输入布尔本例中的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)来为你完成繁重的工作。

当你没有在PHP任何排序learn SQL。我想这PDO tutorial,同时给你内部如何安全地使用SQL。 SQL很容易受到SQL注入的影响,但是由于PDO准备好的语句,您不必再担心这一点。

我有一组结果是从多维数组中拉出的 。 目前阵列关键是产品的价格 而项目包含 包含所有 产品细节另一个数组。

使用ORDER BY进行订购。我会使用一个数据表来做排序客户端。还保险你在服务器上工作(PHP)。你可以看看YUI2's datatable

0

听起来像是你不知道你想要什么阅读

P.S林。你想过滤还是分类?过滤只会显示某种类型的东西。排序会按顺序显示某些内容,并且通过本质聚集在一起。

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

伪代码:

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 
} 
+0

感谢您的答复。对不起,我有问题是根据子数组的值排序主数组。 例如: 产品1个子阵列具有FOO的一个名称。 产品2子数组的名称为bar。 产品3子阵列的名称为baz。 我想通过名称订购的主阵列 – fl3x7 2011-01-28 20:31:07

+0

好,我编辑和添加多维数组排序。 – profitphp 2011-01-28 20:34:03

+0

非常感谢。去尝试这个:) – fl3x7 2011-01-28 22:24:20

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