我有一个看起来像
的数组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 :(得分: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
)