2014-12-13 5 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, но даже не смог их отсортировать.

Я не могу пройти первый уровень.

Благодаря Sebastian

ответ

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' потери массивные ключи ... Спасибо :) –

+0

Ваш массив не отсортирован, как требуется OP. Так что соберите его, и ваш ответ в порядке! – Rizier123

+0

Извините, я допустил ошибку в моем примере. его нужно было сортировать по DESC на основе Counts. Я исправился. Поэтому я заменил второй krsort на arsort, и это работает отлично. Благодаря обоим. – Sebastian

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 
     ) 

) 
Смежные вопросы