2011-01-28 7 views
3

У меня есть массив, который выглядит какПодсчитайте количество разных строк?

Array 
(
    [1] => Array 
     (
      [0] => Date 
      [1] => Action 
     ) 

    [2] => Array 
     (
      [0] => 2011-01-22 11:23:19 
      [1] => SHARE_TWEET 
     ) 

    [3] => Array 
     (
      [0] => 2011-01-22 11:23:19 
      [1] => SHARE_FACEBOOK 
     ) 

и многих других различных значений (около 10), что я хочу делать, я хочу, чтобы подсчитать количество раз строка в массиве. Я собирался использовать array_count_values, но он не учитывает многомерные массивы.

Любые другие варианты?

+0

Там может быть другая функция для нее, но я бы рекурсивно пройти через массив с array_walk (довольно очевидному, я думаю), и проверить, если значение является строка. –

+1

Используйте 'echo var_export ($ array)' вместо 'print_r ($ array)', его проще использовать ;-) – arnaud576875

ответ

5

Это может быть сделано путем первого уплощение массива, а затем с помощью array_count_values() на нем:

Для выпрямления, вот трюк:

$array = call_user_func_array('array_merge', $arrays); 

И потом:

$counts = array_count_values($array); 

Выход:

array (
    'Date' => 1, 
    'Action' => 1, 
    '2011-01-22 11:23:19' => 2, 
    'SHARE_TWEET' => 1, 
    'SHARE_FACEBOOK' => 1, 
) 

Полный код:

$array = call_user_func_array('array_merge', $arrays); 
var_export(array_count_values($array)); 
0

псевдокоде

$inputArray = // your array as in the example above 

foreach ($inputArray as $key => $value) { 
    $result[$value[1]] = $result[$value[1]] + 1; 
} 

var_dump($result); 
0

Вот способ сделать работу:

$arr = Array (
    1 => Array (
      0 => 'Date', 
      1 => 'Action' 
    ), 
    2 => Array (
      0 => '2011-01-22 11:23:19', 
      1 => 'SHARE_TWEET' 
    ), 
    3 => Array (
      0 => '2011-01-22 11:23:19', 
      1 => 'SHARE_FACEBOOK' 
    ) 
); 

$result = array(); 
function count_array($arr) { 
global $result; 
    foreach($arr as $k => $v) { 
     if (is_array($v)) { 
      count_array($v); 
     } else { 
      if (isset($result[$v])) { 
       $result[$v]++; 
      } else { 
       $result[$v] = 1; 
      } 
     } 
    } 
} 
count_array($arr); 
print_r($result); 

выход:

Array 
(
    [Date] => 1 
    [Action] => 1 
    [2011-01-22 11:23:19] => 2 
    [SHARE_TWEET] => 1 
    [SHARE_FACEBOOK] => 1 
) 
1

Каждый раз, когда вы имеете дело с массивами, особенно с циклами в PHP, я не могу достаточно рассказать, что вы смотрите на документацию массива. Вы были бы удивлены, насколько быстро вы понимаете, что большинство циклов в вашем коде не нужно. PHP имеет встроенную функцию для достижения того, что вы получили после вызова array_walk_recursive. И так как вы используете PHP5 вы можете использовать затворы скорее, create_function (что может быть очень трудным, особенно для отладки, и не могут быть оптимизированы с помощью интерпретатора PHP Afik)

$strings = array(); 
array_walk_recursive($arr, function($value, $key) use (&$strings) { 
    $strings[$value] = isset($strings[$value]) ? $strings[$value]+1 : 1; 
}); 

Я знаю, одинарные заявления Арен всегда ясно, но это достаточно просто, но не стесняйтесь расширять выражение if.

Результат вышеперечисленное:

print_r($strings); 
Array 
(
    [Date] => 1, 
    [Action] => 1, 
    [2011-01-22 11:23:19] => 2, 
    [SHARE_TWEET] => 1, 
    [SHARE_FACEBOOK] => 1, 
) 
Смежные вопросы