计算不同字符串的数量?

时间:2011-01-28 15:26:48

标签: php arrays

我有一个看起来像

的数组
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,但它不计算多维数组。

还有其他选择吗?

4 个答案:

答案 0 :(得分: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));

答案 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,
)

答案 2 :(得分:0)

伪代码

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

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

var_dump($result);

答案 3 :(得分: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
)