2013-03-28 18 views
0

我需要使用PHP对关联数组进行排序。具有三个变量的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; 
    } 
}); 

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

+0

你的代码在哪里?到目前为止你做了什么?我们可以尝试用你的代码来帮助你,但是我们不能为你写。 – Uby

回答

0

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

+0

由于您将使用字符串处理进行比较,因此如果您希望获得大量数据,则可能需要缓存“名称”值的“含义”:在排序之前,为每个项目插入排序所需的3个值,例如,对于第一个,添加'_sort'=>数组(60,90,'6'),第二个'_sort'=>数组(40,120,'KD')... –

+0

Thx用于输入。 – aebersold

0

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

+0

连续两次错误的建议。首先,usort()不维护键,这将是结果。其次,不要使用正则表达式;特别是对于不需要它的字符串;如果你确定字符串非常固定的格式,请使用explode()。 –

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(圣人咨询)比usort()比较合适,因为它保留了数组的键值关联。如果没有这些维护,结果将是:0,1,2,3,4,5隐藏原始数组如何重新排序。

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

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