2013-10-18 95 views
0

嗨如何排序一个多维数组,取决于3个值,ps_kind,ps_date,ps_premium。 我会感谢任何答案或片段。由三个值排序多维数组

Array 
(
    [0] => Array 
     (
      [ps_date] => 2013-08-05 20:56:33 
      [ps_kind] => Gold 
      [ps_premium] = > 1 
     ) 
    [1] => Array 
     (
      [ps_date] => 2013-08-05 20:46:33 
      [ps_kind] => Gold 
      [ps_premium] = > 0 
     ) 
    [2] => Array 
     (
      [ps_date] => 2013-08-05 20:16:33 
      [ps_kind] => Silver 
      [ps_premium] = > 0 
     ) 

    [3] => Array 
     (
      [ps_date] => 2013-08-05 20:06:33 
      [ps_kind] => Bronze 
      [ps_premium] = > 0 
     ) 
) 

我用这个代码努力,但他不工作正确

function cmp($a, $b) 
     { 
      $pos = array (
       'Gold'  => 1, 
       'Silver'  => 2, 
       'Bronze'  => 3, 
      ); 
      list ($a1, $c1) = explode('', $a['ps_kind']); 
      list ($a2, $c2) = explode('', $b['ps_kind']); 
      $catcmp = strcmp(trim($c1), trim($c2)); 
      if ($catcmp==0) 
       return $pos[trim($a1)] - $pos[trim($a2)]; 
      else return $catcmp; 
     } 



     $result = $this -> db ->query($query); 



     foreach ($result as $element) { 

      $array[] = $element; 
     } 

     usort($array,'cmp'); 

     $index = 0; 

     foreach ($array as $single) { 

      $count = $index + 1; 


      if($array[$index]['ps_date'] < $array[$count]['ps_date'] && $array[$index]['ps_kind'] == $array[$count]['ps_kind']) { 

       $prev = $array[$index]; 

       $next = $array[$count]; 

       $array[$index] = $next; 

       $array[$count] = $prev; 

      } 

      $index++; 

     } 
+4

这不是一个网站,您可以免费索取代码!向我们展示您尝试过的方式,我们将帮助您。 – ComFreek

+0

我没有打算要求代码bcz我写了“或片段”,所以我认为有人可以写线索或somthing – wrcode

+0

我想你可以使用[''usort'](http://php.net/manual /en/function.usort.php)与一个自定义函数。 – Sumurai8

回答

0

如果您使用usort,则可以使用用户定义的函数对数组进行排序。此函数必须返回-1,0或1.以下示例代码将首先测试ps_kind,如果它们相同,则将测试ps_premium。这将首先与'青铜'分类。

function test($a, $b) { 
    $pos = Array('Gold' => 1, 'Silver' => 2, 'Bronze' => 3); 
    if($pos[$a['ps_kind']] < $pos[$b['ps_kind']]) { 
    return 1; 
    } else if($a['ps_kind'] == $b['ps_kind']) { 
    if($a['ps_premium'] < $b['ps_premium']) { 
     return 1; 
    } else if($a['ps_premium'] == $b['ps_premium']) { 
     return 0; 
    } else { 
     return -1; 
    } 
    } else { 
    return -1; 
    } 
} 

$x = Array(Array 
     (
      ps_date => "2013-08-05 20:56:33", 
      ps_kind => "Gold", 
      ps_premium => 1 
     ), Array 
     (
      ps_date => "2013-08-05 20:06:33", 
      ps_kind => "Bronze", 
      ps_premium => 0 
     ), Array 
     (
      ps_date => "2013-08-05 20:46:33", 
      ps_kind => "Gold", 
      ps_premium => 0 
     ), Array 
     (
      ps_date => "2013-08-05 20:16:33", 
      ps_kind => "Silver", 
      ps_premium => 0 
     ) 
); 

usort($x, "test"); 
var_dump($x); 
0

如何做某事。像这样:http://php.net/manual/en/function.usort.php

和替换$a$a['ps_kind'](同为$ B)和$a['ps_kind'] == $b['ps_kind']你ps_date再次添加同样的功能,所以如果ps_kind是相同的排序ps_date(相同于ps_date => ps_premium)

如果您在此处尝试=>注释之后对此有疑问:)