使用多个条件对关联数组进行排序

时间:2015-03-02 09:06:23

标签: 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");
        $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告诉我一种方法吗? /强>

2 个答案:

答案 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)

有两个主要问题。

  1. 根据您的描述,您使用status作为第一个关键字kids
  2. 您需要检查第一个减法是否为零,如果是,则比较id值。
  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);
        $result =  $pos_a - $pos_b;
        if ($result != 0) return $result;
    
        return intval($b['ID']) - intval($a['ID']);
    });
    
    var_dump($tables);