2011-01-28 14 views
0

Googleではこれに関する有用な情報を実際に見つけることができます。検索結果をPHPでフィルタリング

私は多次元配列から引き出された一連の結果を持っています。現在、配列キーは商品の価格ですが、商品にはすべての商品詳細を含む別の配列が含まれています。

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

だから、現在、私はちょうどキーで注文項目をリストする場合、最小の第一およびそれが最初の製品最小の価格を示しています。

しかし、ユーザーが結果を見ると、名前、特定の製造元、色、x、y、zなどのすべての製品をドロップダウンボックスから一覧表示するなどの他の注文オプションを選択できるようにしたい(または類似のもの)

これは私がいくつかのガイダンスを必要とするところです。私はちょうどそれまたはベストプラクティスまたは何かについて行く方法がわからない。私が考えることができる唯一の方法は、ネストされた配列によってすべての項目を名前、メーカーなどで並べ替えることですが、PHPでどのように行うのですか?

私は達成しようとしていることを理解していることを願っています。アイデア、アプローチ、または例についてこれに関する助けがあれば、素晴らしいことになります。あなたが欲しいものを知っていないようPHP5

答えて

0

は、メモリデータベースで使用して少しスニペットと例を更新しました:) PS:私はブール値として入力を確認するため、XSS保護この例では全く必要ありません値。逆の順序で結果を確認するには、

<?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); 

order?descはあなたが(ちょうど聞かない場合) しようとイムは達成かを理解ホープを指定します。 に関するご意見、考え方、または の例を参考にしてください。

まず、PHP5を使用していると言っている質問がいくつかあります。データ(RDBMS)をどのように取得しますか?そうでない場合、PHP5はSQLite enabled by defaultです。私はあなたのために少なくともRDBMS(SQLite/etc)を使用する必要があると思います。

learn SQLの場合、PHPでソートする必要はありません。私はこれをPDO tutorialと思っていますが、安全にSQLを使用する方法を教えてくれます。 SQLはSQLインジェクションに対して脆弱ですが、PDOの準備済みステートメントのおかげでそれ以上心配する必要はありません。

私は の多次元配列から引き出された一連の結果を持っています。 現在、配列キーは製品の の価格ですが、商品には の商品がすべて含まれている別の配列 が含まれています。

ORDER BYをご注文ください。私はクライアント側の並べ替えを行うdatatableを使用します。また、サーバー(PHP)で作業することもできます。例えば、YUI2's datatableを見ることができます。

+0

ご返信ありがとうございます。はい、私はデータベースを使用して良いと思ったが、私はXMLソースからリアルタイムのデータを取得しています。 PDOのおかげでありがとう、それは興味深いね!結果がページされるので、私がYUI2データテーブルを使用できるかどうかは分かりません。あなたの入力のためにたくさんありがとう:) – fl3x7

+0

@ fl3x7いいえ私はあなたがすべての例を見ている必要があります(それは本当に強力です)YUI2 datatableを使用することができると思います。ページ番号のついた例=> http://developer.yahoo.com/yui/examples/datatable/dt_dynamicdata.htmlもあります。多くの人が知らない何かを指摘したいと思います。インメモリデータベースのようにSQLiteデータベースを使うことができます;)私はすぐに少しの紹介のために私の答えを更新します。 – Alfred

+0

@ fl3x7 'new PDO( 'sqlite :: memory:');' – Alfred

0

を使用して

p.sイムを読み取るための

おかげでね。フィルタリングまたは並べ替えを行いますか?フィルタリングでは特定のタイプのものだけが表示されます。ソートでは特定のものが順番に表示され、性質上、まとめて表示されます。

フィルタリングする場合は、結果を出力する前に配列をループして、フィールドが条件に一致するかどうかを確認します。

擬似コード:

foreach $results as $result 
    if ($result['type']==$filtertype) 
    echo $result['name']; 

編集

多次元配列をソートするために、あなたがしてそれを並べ替え、ソートしたい特定の列のキーと値を保持するために別の配列を使用することができますキーを保持したままその配列をループして、必要な順序でキーを取得します。ソートされた1次元配列のキーを使用して、元の結果配列の値にアクセスします。

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

+0

OK、多次元配列ソートを編集して追加しました。 – profitphp

+0

ありがとうございました。これを試してみよう: – fl3x7

2

まず、価格をキーとして使用することは実際には最良の方法ではありません。 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

+0

あなたは価格が正しいです。私が当時どのようにソートするか分からなかったので、各キーに非常に小さな数値を追加してユニークにしました(これは悪い習慣です)!! – fl3x7

関連する問題