我有一个名为" parents_kids"的表,它有三列称为:
id Guardian kids
1 Greg 1
2 Gary 3
3 Aaron 2
4 Farb 3
5 REX 1
6 Fred 2
在下面的代码中,我将其放入数组并打印出来:
$exc = $conn->prepare("SELECT ID,Guardian,kids from current_state");
$exc->execute();
while($finalResult = $exc->fetch(PDO::FETCH_ASSOC))
{
$tables[] = $finalResult;
}
var_dump($tables);
一旦我把它变成一个数组,我按照自定义顺序对其进行排序 首先是有2个孩子的监护人,然后是1个孩子,有3个
ID Guardian kids
3 Aaron 2
6 Fred 2
1 Greg 1
5 REX 1
4 Farb 3
2 Gary 3
现在我的要求是根据ID的降序对数组的其余部分进行排序,
就像这样
ID Guardian kids
6 Fred 2
3 Aaron 2
5 REX 1
1 Greg 1
4 Farb 3
2 Gary 3
我尝试了很多次,但它的工作,我用来排序第一个要求的代码如下
$order = array("2", "1", "3");
usort($tables, function ($a, $b) use ($order) {
$pos_a = array_search($a['kids'], $order);
$pos_b = array_search($b['kids'], $order);
return $pos_a - $pos_b;
});
任何人都可以帮助我满足我的第二个要求,即按ID降序排列
这就是数组的样子
array (size=3)
0 =>
array (size=3)
'ID' => string '3' (length=1)
'Guardian' => string 'Aaron' (length=5)
'kids' => string '2' (length=1)
array (size=3)
1 =>
array (size=3)
'ID' => string '6' (length=1)
'Guardian' => string 'FRED' (length=4)
'kids' => string '2' (length=1)
等
PS从表中执行它是行不通的,因为我在代码上方使用循环使得无法从SQL中执行此操作,任何人都可以通过php告诉我一种方法吗? /强>
答案 0 :(得分:2)
我认为它应该有所帮助:
select ID,Guardian,kids
from current_state
order by case WHEN kids = 2 then 1
WHEN kids = 1 then 2
WHEN kids = 3 then 3
ELSE kids END ASC
, ID desc
答案 1 :(得分:0)
有两个主要问题。
status
作为第一个关键字kids
。这是一个有效的解决方案。
$order = array("2", "1", "3");
usort($tables, function ($a, $b) use ($order) {
$pos_a = array_search($a['kids'], $order);
$pos_b = array_search($b['kids'], $order);
$result = $pos_a - $pos_b;
if ($result != 0) return $result;
return intval($b['ID']) - intval($a['ID']);
});
var_dump($tables);