Php 多条件关联数组排序

Php 多条件关联数组排序,php,arrays,sorting,Php,Arrays,Sorting,我有一个名为“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"

我有一个名为“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);
一旦我把它放入一个数组,我就按照自定义顺序对它进行排序,其中 首先是有两个孩子的监护人,然后是有一个孩子和三个孩子的监护人

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) 


p.S从表中执行该操作是行不通的,因为我在代码上方使用了一个循环,这使得从SQL中执行该操作变得不可能。有人能告诉我从php执行该操作的方法吗

我认为它应该有帮助:

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

有两个主要问题

  • 根据您的描述,您使用了
    status
    作为第一个键,而它应该是
    kids
  • 您需要检查第一次减法是否为零,如果是,则比较id值
  • 这里有一个有效的解决方案

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

    你能编辑你的帖子并添加数组的样子吗?为什么不在你的查询中添加一个ORDER BY,让SQL server按照你想要的顺序返回数据呢?这背后有一个更大的代码,记录是使用SQL逐个添加的,因此ORDER BY不适用于它,这就是为什么我将它放入数组并进行排序的原因it@ShoGumLew,如果这不起作用,您将不得不编辑您的示例,因为我对您的示例进行了测试。:)不需要:这就像一个魔咒。。。顺便说一句,你能告诉我在什么地方用“use”来练习这种排序吗keyword@ShoGumLew,我不知道有任何网站提供比较器的具体实践,但如果你想改进你的算法,你可以看看Topcoder。