如何在PHP关联数组中按$ value对SQL查询结果进行排序?

时间:2018-02-21 15:57:43

标签: php sql arrays sorting

我有一个数组,它是SQL查询的结果。当我print_r($results)时,我

Array ( [0] => Array ( [Q1] => 24 ) ) Array ( [0] => Array ( [Q2] => 12 ) ) Array ( [0] => Array ( [Q3] => 14 ) ) Array ( [0] => Array ( [Q4] => 10 ) ) etc.

当我使用foreach ($result as $key=>$value)循环显示HTML内容时,我得到了

-----------
|Q1 |   24|
|Q2 |   12|
|Q3 |   14|
|Q4 |   10|
-----------

但我想按值对数组进行排序,以便我得到

-----------
|Q4 |   10|
|Q2 |   12|
|Q3 |   14|
|Q1 |   24|
-----------

第二列是计算的结果,而不是实际的DB列,所以我不能在SQL中使用ORDER BY。这是查询本身:

SELECT (SUM(Q".$i.")) AS Q$i FROM marks

我尝试过排序函数 - arsort($results)和其他人。我已经尝试重新分配到2D数组 - $final_result[] = $results;和排序 - 但没有运气。

在尝试访问$ results中的实际值时,是否有一些技巧? (24,12,14等)

2 个答案:

答案 0 :(得分:0)

结合使用usort(用户函数排序),strcmp(字符串比较)和key(对于变量键),您可以处理:

$quarters = array(
    array(
        'Q1' => 24
    ),
    array(
        'Q2' => 12
    ),
    array(
        'Q3' => 14
    ),
    array(
        'Q4' => 10
    )
);

usort($quarters, function($a, $b) {
    return reset($a) - reset($b);
});

print_r($quarters);

给我们:

Array
(
    [0] => Array
        (
            [Q4] => 10
        )

    [1] => Array
        (
            [Q2] => 12
        )

    [2] => Array
        (
            [Q3] => 14
        )

    [3] => Array
        (
            [Q1] => 24
        )

)

答案 1 :(得分:0)

我找到了一种对查询结果进行排序的方法。这是一种解决方法。

问题是我的查询SELECT FLOOR(SUM(Q".$i.")) AS Q$i FROM table没有产生asort(), usort()等可以处理的关联数组。

当我输出var_export($results)时输出:

array ( 0 => array ( 'Q1' => '24', ), )array ( 0 => array ( 'Q2' => '12', ), )array ( 0 => array ( 'Q3' => '14', ), )array ( 0 => array ( 'Q4' => '10', ), )

注意非递增0;这似乎是排序算法无法正常工作的原因。

但是,我 能够在foreach循环中显示查询结果而不会出现问题:

-----------
|Q1 |   24|
|Q2 |   12|
|Q3 |   14|
|Q4 |   10|
-----------

所以我的解决方案是将查询结果重新分配给该循环中的关联数组,如下所示:

foreach ($results as $result) 
      { 
            foreach ($result as $key=>$value)
                { 
            $rankings["$key"]="$value"; 
            } 
          }
   }

现在,var_export($rankings)显示了我期望的数据结构:

array ( 'Q1' => '24', 'Q2' => '12', 'Q3' => '14', 'Q4' => '10', )

这个新的数组 适合排序:

asort($rankings);

-----------
|Q4 |   10|
|Q2 |   12|
|Q3 |   14|
|Q1 |   24|
-----------