PHP排序数组有三个变量

时间:2013-03-28 20:41:08

标签: php arrays multidimensional-array sorting

我需要帮助用PHP对关联数组进行排序。

排序应该依赖于数组键“name”,并保持键/值对。按照排序顺序: 1)第一个整数 ASC,2)第二个整数 ASC,3)第三个混合 ASC

输入

array(6) {
  [0]=>
  array(2) {
    ["name"]=>
    string(13) "60 to 90 in 6"
    ["timing"]=>
    float(4.7)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(15) "40 to 120 in KD"
    ["timing"]=>
    float(3.3)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(14) "60 to 100 in 4"
    ["timing"]=>
    float(1.5)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(13) "60 to 90 in 4"
    ["timing"]=>
    float(2.4)
  }
  [4]=>
  array(2) {
    ["name"]=>
    string(15) "140 to 160 in 6"
    ["timing"]=>
    float(2.4)
  }
  [5]=>
  array(2) {
    ["name"]=>
    string(13) "60 to 90 in KD"
    ["timing"]=>
    float(5.7)
  }
}

输出订单

1, 3, 0, 5, 2, 4

非常感谢你的帮助。


答案:

uasort($acceleration, function($a, $b) {    
    if($a['_sort'][0] == $b['_sort'][0] AND $a['_sort'][2] == $b['_sort'][2])
    {                       
        if($a['_sort'][4] < $b['_sort'][4])
            return -1;
        elseif($a['_sort'][4] > $b['_sort'][4])
            return 1;
        else
            return 0;
    }
    elseif($a['_sort'][0] == $b['_sort'][0])
    {
        if($a['_sort'][2] < $b['_sort'][2])
            return -1;
        elseif($a['_sort'][2] > $b['_sort'][2])
            return 1;
        return 0;
    }
    else
    {
        if($a['_sort'][0] < $b['_sort'][0])
            return -1;
        elseif($a['_sort'][0] > $b['_sort'][0])
            return 1;
        else
            return 0;
    }
});

我敢肯定,有一种更优雅的方式,但可以作为输入。

3 个答案:

答案 0 :(得分:0)

在使用uasort()排序后,您需要此数组的array_keys。比较函数(闭包)应该很容易编写。

答案 1 :(得分:0)

您应该使用usort(),它允许您使用用户定义的comarison函数进行排序。因此,您必须实现比较neme字段并根据结果返回-1,0或1值的函数(少于,等于或大于)。此函数可以使用正则表达式从name strng字段中获取三个值,然后使用您的条件对它们进行比较。

答案 2 :(得分:0)

<?php

$acceleration = array();
$acceleration[0]= array("name" => "60 to 90 in 6",   "timing" => 4.7 );
$acceleration[1]= array("name" => "40 to 120 in KD", "timing" => 3.3 );
$acceleration[2]= array("name" => "60 to 100 in 4",  "timing" => 1.5 );
$acceleration[3]= array("name" => "60 to 90 in 4",   "timing" => 2.4 );
$acceleration[4]= array("name" => "140 to 160 in 6", "timing" => 2.4 );
$acceleration[5]= array("name" => "60 to 90 in KD",  "timing" => 5.7 );


function comp_maker( $key ) {
    return function ($a, $b) use ( $key ) {     // closure for uasort() to use
        return strnatcmp( $a[$key], $b[$key] ); // comp by "natural order" 
    };
}

uasort($acceleration, comp_maker( 'name' ) );

// display sorted array's keys 
$str = '';
foreach ( $acceleration as $key => $value ){
    $str .= ", $key";
}
echo substr($str,1);

// output:  1, 3, 0, 5, 2, 4

您还可以查看代码here

此解决方案遵循有关应用uasort()的sage建议,这比usort()更合适,因为它保留了数组的键值关联。如果没有这些维护,结果将是:0,1,2,3,4,5隐藏了原始数组的重新排序方式。

请注意,uasort()的第二个参数将作为调用comp_maker()函数的结果计算为闭包。 uasort()反过来会调用闭包,以便它可以执行比较。通过使用strnatcmp()根据“人类顺序”进行排序,因此值按照预期的升序显示。

为了获得结果,我可以使用array_keys(),但是通过使用key,value语法迭代数组来输出排序数组键的新顺序,而选择避免函数调用的开销。