2011-01-28 218 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