2014-12-13 60 views
0

我有此数组:PHP array_count_values排序多维数组

Array 
(
    [LEVEL1] => Array 
     (
      [0] => 18 
      [1] => 12 
      [2] => 16 
      [3] => 12 
      [4] => 12 
     ) 

    [LEVEL2] => Array 
     (
      [0] => 16 
      [1] => 18 
      [2] => 19 
      [3] => 19 
      [4] => 16 
     ) 

) 

我想获得通过按键来分类汇总。

Array 
(
    [LEVEL1] => Array 
     (
      [12] => 3 
      [16] => 1 
      [18] => 1 
     ) 

    [LEVEL2] => Array 
     (
      [19] => 2 
      [16] => 2 (rectification on the sorting) 
      [18] => 1 
     ) 

) 

我尝试了许多函数,我在php.net中找到,但没有设法排序它。

我无法通过第一级。

感谢 塞巴斯蒂安

回答

3

使用array_map() & array_count_values()。例如:

$your_arr = Array(
    'LEVEL1' => Array(18,12,16,12,12), 
    'LEVEL2' => Array(16,18,19,19,16,) 
); 

$keys = array_keys($your_arr); 
$result = array_combine($keys, array_map(function($v, $k){ 
    $values = array_count_values($v); 
    ($k == 'LEVEL1') ? ksort($values) : krsort($values); 
    return $values; 
}, $your_arr, $keys)); 

print '<pre>'; 
print_r($result); 
print '</pre>'; 

输出:

Array 
(
    [LEVEL1] => Array 
     (
      [12] => 3 
      [16] => 1 
      [18] => 1 
     ) 

    [LEVEL2] => Array 
     (
      [19] => 2 
      [18] => 1 
      [16] => 2 
     ) 
) 
+0

我一直认为,这'array_map'损失数组键...谢谢:) – 2014-12-13 18:15:11

+0

你的数组没有像OP想要的那样排序。所以排序它,你的答案很好! – Rizier123 2014-12-13 18:20:25

+0

对不起,我在我的例子中犯了一个错误。它必须由DESC根据Counts进行排序。我纠正了它。所以我改变了第二个评论,并且完美地工作。感谢这两个。 – Sebastian 2014-12-14 11:48:24

2

这应该为你工作:

<?php 

    $array = array (
      "LEVEL1" => array (18, 12, 16, 12, 12), 
      "LEVEL2" => array (16, 18, 19, 19, 16) 
     ); 

    $newarray = array(); 

    foreach($array as $k => $v) { 
     $newarray[$k] = array_count_values($array[$k]); 
     if($k == "LEVEL1") 
      ksort($newarray[$k]); 
     elseif($k == "LEVEL2") 
      krsort($newarray[$k]); 
    } 

    print_r($newarray); 

?> 

输出:

Array 
(
    [LEVEL1] => Array 
     (
      [12] => 3 
      [16] => 1 
      [18] => 1 
     ) 

    [LEVEL2] => Array 
     (
      [19] => 2 
      [18] => 1 
      [16] => 2 
     ) 

)