按自定义顺序对php数组进行排序

时间:2015-02-25 07:18:36

标签: php mysql

我有一个名为" car_owners"的表,它有三列称为:

id  owner   cars
1   Greg    1
2   Gary    3
3   Aaron   2
4   Farb    3
5   REX     1
6   Fred    2

在下面的代码中,我将其放入数组并打印出来:

$exc = $conn->prepare("SELECT name,state from current_state");
        $exc->execute();
            while($finalResult = $exc->fetch(PDO::FETCH_ASSOC))
             {
                        $tables[] = $finalResult;
             }
var_dump($tables);

一旦我把它变成一个数组,有没有办法我可以按照自定义顺序对它进行排序,我可以得到如下的输出, 首先是2辆车的车主,然后是1辆车,谁有3辆

owner   cars
Aaron   2
Fred    2
Greg    1
REX     1
Farb    3
Gary    3

PS从表中执行它是行不通的,因为我在代码上方使用循环使得无法从SQL中执行此操作,任何人都可以通过php告诉我一种方法吗? /强>

5 个答案:

答案 0 :(得分:3)

select * from your_table
order by case when cars = 2 then 1
              when cars = 1 then 2
              when cars = 3 then 3
              else 4
         end

答案 1 :(得分:1)

如果您已从mysql表中准备好阵列,则可以使用以下代码 -

$car_array=array(
    "Aaron"=>2,
    "Fred"=>2,
    "Greg"=>1,
    "REX"=>1,
    "Farb"=>3,
    "Gary"=>3,
    );

$sort_array=array("2","1","3");
$new_array=array();

foreach ($sort_array as $key => $value) 
{
    foreach ($car_array as $key1 => $value1) 
    {
        if ($value1 == $value ) 
            $new_array[$key1]=$value1;
    }   
}


print_r($new_array);

答案 2 :(得分:1)

考虑通过sql本身对结果集进行排序。 @juergen提供的sql符合目的。我想在查询中进行的唯一更改是按顺序'添加所有者字段。请考虑以下代码段

select * from car_owners
order by (case when cars = 2 then 1
              when cars = 1 then 2
              when cars = 3 then 3
              else 4
         end), owner

这应符合目的,并根据需要准确提供结果集。

此外,如果您明确需要通过php对其进行排序,那么您可以使用php usort()函数并对数组进行排序,编写自定义函数。

答案 3 :(得分:1)

仅使用PHP,您可以使用uksort函数使用用户定义的比较函数对数组进行排序。以下代码需要$tables变量的副本。

<?php
$tables2=$tables;
uksort($tables2, function($r1, $r2) use ($tables) {
    return ($tables[$r1]["cars"]%3) < ($tables[$r2]["cars"]%3);
});
print_r($tables2);

答案 4 :(得分:1)

您可以使用usort对值进行排序。如果两个车主拥有相同数量的车辆,这也将按名称排序。我更改了SELECT语句以匹配给定的数据库定义。

$exc = $conn->prepare("SELECT owner, cars from current_state");
$exc->execute();

while ($finalResult = $exc->fetch(PDO::FETCH_ASSOC))
{
    $tables[] = $finalResult;
}

usort(
    $tables,
    function($a, $b) {
        // If same number of cars, sort by name
        if ($a['cars'] == $b['cars']) return strcmp($a['owner'], $b['owner']);

        // If owner a has two cars, place before b
        if ($a['cars'] == 2) return -1;

        // If owner b has two cars, place below a
        if ($b['cars'] == 2) return 1;

        // Neither owner a nor owner b has two cars, sort by number of cars
        return ($a['cars'] < $b['cars']) ? -1 : 1;
    }
);

foreach ($tables as $row) {
    echo $row['owner'], ' => ', $row['cars'], PHP_EOL;
}

输出:

Aaron => 2
Fred => 2
Greg => 1
REX => 1
Farb => 3
Gary => 3