2017-03-27 27 views
-1

我使用PHP进行编码并拥有多维数组。我想排序我的数组。最重要的标准是总积分。第二个标准是名称。按照几个标准对PHP排序数组

换句话说,阵列应该被排序这种方式:

第一通过[信息] [总],通过[信息] [名称]降序

第二,上行

Array (
    [183] => Array (
    [3] => Array (
     [1] => Array() 
    ) 

    [1] => Array (
     [8] => Array() 
    ) 

    [info] => Array (
     [name] => Doe John /* 2nd criteria */ 
     [total] => 4800 /* 1st criteria */ 
    ) 
) 

    [380] => Array (
    [4] => Array (
     [6] => Array() 
    ) 

    [info] => Array (
     [name] => Davis Ben /* 2nd criteria */ 
     [total] => 14500 /* 1st criteria */ 
    ) 

    [2] => Array (
     [5] => Array() 
    ) 
) 
) 

所以,结果应该是这样的:

Array (
    [380] => Array (
    [4] => Array (
     [6] => Array() 
    ) 

    [info] => Array (
     [name] => Davis Ben 
     [total] => 14500 
    ) 

    [2] => Array (
     [5] => Array() 
    ) 
) 

    [183] => Array (
    [3] => Array (
     [1] => Array() 
    ) 

    [1] => Array (
     [8] => Array() 
    ) 

    [info] => Array (
     [name] => Doe John 
     [total] => 4800 
    ) 
) 
) 

我已经试过这样:

foreach ($array as &$item) 
{ 
    uasort($item, function ($a, $b) 
    { 
    if ($a['total'] == $b['total'] 
    { 
     return $b['name'] - $a['name']; 
    } 
    else 
    { 
     return $b['total'] - $a['total']; 
    } 
    }); 
} 

我也尝试过这一点,但它并不能帮助:

foreach ($array as &$item) 
{ 
    uasort($item, function ($a, $b) 
    { 
    if ($a['info']['total'] == $b['info']['total']) 
    { 
     return $b['info']['name'] - $a['info']['name']; 
    } 
    else 
    { 
     return $b['info']['total'] - $a['info']['total']; 
    } 
    }); 
} 
+2

* “我用PHP编码” * - 你能证明呢?我只能看到'var_dump()'的一些输出,以及有人为你写代码的无声请求。 – axiac

+0

你似乎有很多空阵列,你为什么不过滤它们?然后你可以用'usort()'http://php.net/manual/en/function.usort.php和你自己的回调函数按照这些标准进行排序。 – Qirel

+0

@axiac我已经用PHP完成了这个数组,并且从MySQL数据库中插入了数据,但我无法对数组进行排序。有空阵列,因为这只是一个例子。 – xms

回答

0

你的问题(ORDER BY定制的标准值,保持键和值之间的关联)的要求完美的描述匹配PHP函数uasort()

的代码是这样的:

$input = Array(
    '183' => Array(
     '3' => Array(
      '1' => Array(), 
     ), 
     '1' => Array(
      '8' => Array(), 
     ), 
     'info' => Array(
      'name' => 'Doe John',  /* 2nd criteria */ 
      'total' => 4800,   /* 1st criteria */ 
     ), 
    ), 
    '380' => Array(
     '4' => Array(
      '6' => Array(), 
     ), 
     'info' => Array(
      'name' => 'Davis Ben',  /* 2nd criteria */ 
      'total' => 14500,   /* 1st criteria */ 
     ), 
     '2' => Array(
      '5' => Array(), 
     ), 
    ), 
); 

uasort($input, function (array $a, array $b) { 
    // compare using the 1st criterion 
    if ($a['info']['total'] != $b['info']['total']) { 
     return $b['info']['total'] - $a['info']['total'];  // < 0 when $a > $b (descending) 
    } 

    // equality on the 1st criterion, use the 2nd one 
    return strcmp($a['info']['name'], $b['info']['name']);  // < 0 when $a < $b (ascending) 
}); 
+0

是的,谢谢axiac。我只是注意到我在没有任何理由的情况下使用了foreach。我把它拿走了。现在代码看起来就像你的:) – xms