[英]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已啟用SQLite 。 我認為您應該至少使用RDBMS (SQLite / etc)為您完成繁重的工作。
學習SQL時 ,不需要在PHP中進行任何排序。 我認為這個PDO教程同時為您提供了如何在安全地使用SQL時使用SQL的內容。 SQL容易受到SQL注入的影響,但是由於PDO的准備好的語句,您不必再為此擔心。
我有一組從多維數組中提取的結果。 目前,數組鍵是產品的價格,而項目包含另一個包含所有產品詳細信息的數組。
使用ORDER BY進行訂購。 我會使用數據表來進行客戶端的排序。 還可以保證您在服務器上工作(PHP)。 例如,您可以查看YUI2的數據表 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.