【问题标题】:How to sort SQL query result by $value in PHP associative array?如何在 PHP 关联数组中按 $value 对 SQL 查询结果进行排序?
【发布时间】:2018-08-01 06:55:50
【问题描述】:

我有一个数组,它是 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) 和其他功能。我尝试重新分配给二维数组 - $final_result[] = $results; 和排序 - 但没有运气。

我在尝试访问 $results 中的实际值时是否遗漏了一些技巧? (24、12、14 等)

【问题讨论】:

  • 试试usort。虽然你的 php 版本应该是 5.2+
  • 您想按值排序并保留键关联,对吗?见php.net/manual/en/array.sorting.php,我认为是asort
  • 你试过asort()吗?它完全满足您的需求。
  • 您可以在查询中使用ORDER BY
  • 我试过 asort()。它不适用于此查询结果。我的代码是: $stmt = $db->prepare("SELECT (SUM(Q".$i.")) AS Q$i FROM tags"); $stmt->执行(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC);排序($结果); foreach ($results as $result) { 显示结果 }

标签: php sql arrays sorting


【解决方案1】:

结合使用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
        )

)

【讨论】:

  • 输出与预期输出不匹配。
  • @axiac 你能详细说明一下吗? OP 请求帮助对数组进行排序,其中变量键按降序排序。这就是我的代码所做的。
  • 将您的输出与句子“但我想按值对数组排序以便得到” 下方的问题中描述的预期输出进行比较。您的代码是 krsort() 的较慢实现。
  • 当我 print_r($quarters) 我得到输出 Array ( [0] => Array ( [Q4] => 10 ) [1] => Array ( [Q3] => 14 ) [ 2] => 数组([Q2] => 12)[3] => 数组([Q1] => 24))。不进行排序。我想按 value 排序,而不是 key。
  • 啊,是的,我误读了这个问题。我已经更新了我的答案。我要指出的是,之前的迭代并不是 krsort 的较慢版本,因为这是多维数组排序,而不是单维。
【解决方案2】:

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

问题是我的查询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|
-----------

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 2018-04-12
    • 2011-07-26
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多