簡體   English   中英

用php過濾搜索結果

[英]filtering search results with php

不能通過Google真的找到任何有用的信息,因此希望這里的知識淵博的人能為您提供幫助。

我有一組從多維數組中提取的結果。 目前,數組鍵是產品的價格,而項目包含另一個包含所有產品詳細信息的數組。

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

因此,當我列出我剛剛按鍵排序的項目時,首先是最小的,它首先列出產品的最小價格。

但是我希望以此為基礎,以便當用戶看到結果時,他們可以選擇其他訂購選項,例如從下拉框(或類似的東西)按名稱,某些制造商,顏色,x,y,z等列出所有產品)

這是我需要一些指導的地方。 我只是不確定如何去做或最佳做法或任何事情。 我能想到的唯一方法是通過嵌套數組排序所有項目,例如名稱,制造商等,但我如何在PHP中執行此操作?

希望你明白我想要實現的目標(如果不是只是問)。 對想法,方法或示例的任何幫助都會很棒。

謝謝閱讀

ps我使用PHP5

首先,使用價格作為關鍵並不是最好的方法; 如果兩個產品價格相同,它們會互相覆蓋。 最好使用唯一鍵(默認鍵可以工作)並將價格也放在子陣列中。

然后,您可以使用函數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

聽起來你不知道自己想要什么。 您想要過濾還是排序? 篩選將僅顯示特定類型的事物。排序將按順序顯示某些事物,並且本質上會聚在一起。

要進行過濾,請遍歷數組,然后再打印結果,請檢查您的字段是否符合條件。

偽代碼:

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
}

更新的示例在內存數據庫中使用了一個小片段:) 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已啟用S​​QLite 我認為您應該至少使用RDBMS (SQLite / etc)為您完成繁重的工作。

學習SQL時 ,不需要在PHP中進行任何排序。 我認為這個PDO教程同時為您提供了如何在安全地使用SQL時使用SQL的內容。 SQL容易受到SQL注入的影響,但是由於PDO的准備好的語句,您不必再為此擔心。

我有一組從多維數組中提取的結果。 目前,數組鍵是產品的價格,而項目包含另一個包含所有產品詳細信息的數組。

使用ORDER BY進行訂購。 我會使用數據表來進行客戶端的排序。 還可以保證您在服務器上工作(PHP)。 例如,您可以查看YUI2的數據表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM