0

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

排序应依赖于数组键“名称”,并保留键/值对。以下排序顺序: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;
    }
});

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

4

3 回答 3

0

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

于 2013-03-28T20:47:14.803 回答
0

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

于 2013-03-28T20:48:13.277 回答
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

你也可以看看这里的代码

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

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

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

于 2014-12-25T08:29:44.857 回答