无法通过Google找到任何有用的信息,所以希望有一些知识的人可以提供帮助。
我有一组从多维数组中提取的结果。目前,数组键是产品的价格,而项目包含另一个包含所有产品详细信息的数组。
key=>Item(name=>test, foo=>bar)
所以目前当我列出我刚刚按键排序的项目时,首先是最小的,它首先列出产品的最小价格。
但是我希望在此基础上进行构建,以便当用户看到结果时,他们可以选择其他订购选项,例如从下拉框中按名称,某些制造商,颜色,x,y,z等列出所有产品(或类似的东西)
这是我需要一些指导的地方。我只是不确定如何去做或最佳做法或任何事情。我能想到的唯一方法是通过嵌套数组排序所有项目,例如名称,制造商等,但我如何在PHP中执行此操作?
希望你明白我想要实现的目标(如果不是只是问)。对想法,方法或例子的任何帮助都会很棒。
感谢您阅读
p.s Im使用PHP5
答案 0 :(得分: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));
答案 1 :(得分:0)
听起来你不知道自己想要什么。您想要过滤还是排序?过滤将仅显示某种类型的东西。排序将按顺序显示某些事物,并且本质上会聚集在一起。
要进行过滤,请在打印结果之前循环遍历数组,检查字段是否符合条件。
伪代码:
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
}
答案 2 :(得分:0)
使用内存数据库中的小片段更新了示例:)
P.S:根本不需要本例中的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)为你做繁重的工作。
当您learn SQL时,您不需要在PHP中进行任何排序。我认为这个PDO tutorial同时为您提供了如何在安全地使用SQL时使用SQL的内容。 SQL很容易受到SQL注入攻击,但是感谢PDO准备好的语句,你不必再担心了。
我有一组结果 从多维数组中拉出来。 目前数组键是价格 该项目包含的产品 另一个包含所有的数组 产品详情。
使用ORDER BY订购。我会使用数据表来进行客户端的排序。还可以保证您在服务器上工作(PHP)。例如,您可以查看YUI2's datatable。