фильтрация результатов поиска с помощью php - PullRequest
0 голосов
/ 28 января 2011

Не могу найти любую полезную информацию об этом через Google, поэтому надеюсь, что кто-то здесь с некоторыми знаниями может помочь.

У меня есть набор результатов, которые извлекаются из многомерного массива. В настоящее время ключ массива - это цена продукта, тогда как элемент содержит другой массив, который содержит все детали продукта.

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

Так что в настоящее время, когда я перечисляю товары, я просто заказываю их по ключу, сначала наименьший, а сначала наименьшая цена товара.

Однако я хочу развить это так, чтобы, когда пользователь видит результаты, он мог выбрать другие варианты заказа, такие как список всех продуктов по имени, определенному производителю, цвету, x, y, z и т. Д. Из выпадающего списка ( или что-то подобное)

Здесь мне нужно руководство. Я просто не знаю, как это сделать, лучшая практика или что-то в этом роде. Единственный способ, которым я могу придумать, - это упорядочить все элементы по вложенному массиву, например, по имени, производителю и т. Д., Но как мне это сделать в PHP?

Надеюсь, вы понимаете, чего я пытаюсь достичь (если не просто спросите). Любая помощь в этом с идеями, подходами или примерами была бы великолепна.

Спасибо за чтение

p.s Я использую PHP5

Ответы [ 3 ]

2 голосов
/ 28 января 2011

Во-первых, использование цен в качестве ключей на самом деле не лучший путь;если два продукта имеют одинаковую цену, они перепишут друг друга.Лучше использовать уникальные ключи (работают по умолчанию) и поместить цену в подмассив.

Затем вы можете использовать функцию 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));

Source/ больше информации: http://us.php.net/manual/en/function.usort.php

0 голосов
/ 29 января 2011

Обновленный пример с небольшим фрагментом, использующимся в базе данных памяти :) 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-инъекций, но благодаря подготовленным инструкциям PDO вам больше не нужно об этом беспокоиться.

У меня есть набор результатов, которые извлекаются из многомерного массива.В настоящее время ключ массива - это цена продукта, в то время как элемент содержит другой массив, который содержит все детали продукта.

Используйте ORDER BY для заказа.Я бы использовал datatable для сортировки на стороне клиента.Также позволяет вам выполнять работу на сервере (PHP).Вы можете, например, взглянуть на данные YUI2 .

0 голосов
/ 28 января 2011

Звучит так, будто ты не знаешь, чего хочешь. Вы хотите фильтрации или сортировки. Фильтрация покажет только вещи определенного типа. Сортировка покажет определенные вещи по порядку и по природе сгруппированы вместе.

Для фильтрации выполните цикл по массиву, прежде чем печатать результаты, проверьте, соответствуют ли ваши поля критериям.

псевдокод:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...