我有一个名为" car_owners"的表,它有三列称为:
id owner cars
1 Greg 1
2 Gary 3
3 Aaron 2
4 Farb 3
5 REX 1
6 Fred 2
在下面的代码中,我将其放入数组并打印出来:
$exc = $conn->prepare("SELECT name,state from current_state");
$exc->execute();
while($finalResult = $exc->fetch(PDO::FETCH_ASSOC))
{
$tables[] = $finalResult;
}
var_dump($tables);
一旦我把它变成一个数组,有没有办法我可以按照自定义顺序对它进行排序,我可以得到如下的输出, 首先是2辆车的车主,然后是1辆车,谁有3辆
owner cars
Aaron 2
Fred 2
Greg 1
REX 1
Farb 3
Gary 3
PS从表中执行它是行不通的,因为我在代码上方使用循环使得无法从SQL中执行此操作,任何人都可以通过php告诉我一种方法吗? /强>
答案 0 :(得分:3)
select * from your_table
order by case when cars = 2 then 1
when cars = 1 then 2
when cars = 3 then 3
else 4
end
答案 1 :(得分:1)
如果您已从mysql表中准备好阵列,则可以使用以下代码 -
$car_array=array(
"Aaron"=>2,
"Fred"=>2,
"Greg"=>1,
"REX"=>1,
"Farb"=>3,
"Gary"=>3,
);
$sort_array=array("2","1","3");
$new_array=array();
foreach ($sort_array as $key => $value)
{
foreach ($car_array as $key1 => $value1)
{
if ($value1 == $value )
$new_array[$key1]=$value1;
}
}
print_r($new_array);
答案 2 :(得分:1)
考虑通过sql本身对结果集进行排序。 @juergen提供的sql符合目的。我想在查询中进行的唯一更改是按顺序'添加所有者字段。请考虑以下代码段
select * from car_owners
order by (case when cars = 2 then 1
when cars = 1 then 2
when cars = 3 then 3
else 4
end), owner
这应符合目的,并根据需要准确提供结果集。
此外,如果您明确需要通过php对其进行排序,那么您可以使用php usort()
函数并对数组进行排序,编写自定义函数。
答案 3 :(得分:1)
仅使用PHP,您可以使用uksort函数使用用户定义的比较函数对数组进行排序。以下代码需要$tables
变量的副本。
<?php
$tables2=$tables;
uksort($tables2, function($r1, $r2) use ($tables) {
return ($tables[$r1]["cars"]%3) < ($tables[$r2]["cars"]%3);
});
print_r($tables2);
答案 4 :(得分:1)
您可以使用usort
对值进行排序。如果两个车主拥有相同数量的车辆,这也将按名称排序。我更改了SELECT
语句以匹配给定的数据库定义。
$exc = $conn->prepare("SELECT owner, cars from current_state");
$exc->execute();
while ($finalResult = $exc->fetch(PDO::FETCH_ASSOC))
{
$tables[] = $finalResult;
}
usort(
$tables,
function($a, $b) {
// If same number of cars, sort by name
if ($a['cars'] == $b['cars']) return strcmp($a['owner'], $b['owner']);
// If owner a has two cars, place before b
if ($a['cars'] == 2) return -1;
// If owner b has two cars, place below a
if ($b['cars'] == 2) return 1;
// Neither owner a nor owner b has two cars, sort by number of cars
return ($a['cars'] < $b['cars']) ? -1 : 1;
}
);
foreach ($tables as $row) {
echo $row['owner'], ' => ', $row['cars'], PHP_EOL;
}
输出:
Aaron => 2
Fred => 2
Greg => 1
REX => 1
Farb => 3
Gary => 3