PHP - 统计特定数组值的数量

68

如何计算数组中值等于常量的元素数量?例如,

$myArray = array("Kyle","Ben","Sue","Phil","Ben","Mary","Sue","Ben");

我怎样才能直接知道里面有多少个“Ben”?

10个回答

146
$array = array("Kyle","Ben","Sue","Phil","Ben","Mary","Sue","Ben");
$counts = array_count_values($array);
echo $counts['Ben'];

12
如果数组是多维的,该怎么办? - Oki Erie Rinaldi
15
@OkiErieRinaldi那么原帖的提问者需要更新问题。 - James
1
@James,你能给我一个参考吗? - Oki Erie Rinaldi
2
@OkiErieRinaldi:我在谷歌上找到的第一个SO结果是:在多维数组中计算特定值 - 看看它是否适用于多维数组。 - Cullub
6
如果你计算一个不在数组中的元素,会显示注意:未定义的索引 - Elyor
显示剩余4条评论

42
你可以使用array_keyscount来实现。
$array = array("blue", "red", "green", "blue", "blue");
echo count(array_keys($array, "blue"));

输出:

3

2
这是最佳答案,因为它不会打扰 PHP 计算所有值的所有出现次数,它只返回符合条件的键并以一种永远不会抛出“Notice”的方式计数。换句话说,echo count(array_keys($array, "purple")); 会打印 0,没有 Notice。这比 array_count_values() 更优秀/更清晰。+1 - mickmackusa
5
我对@Rajat Singhal发布的代码和这段代码进行了测试。在PHP 7中,使用count(array_keys())的解决方法总是更快。在PHP 5.6中,对于具有较少不同元素的数组,array_count_values()版本更快。总体来说,这两个函数都非常快(至少对我正在测试的数组如此)。 - miile7
2
在我看来,这是最好的答案,因为它适用于包含字符串和整数以外的其他值的数组,而 array_count_values() 则会抱怨。+1 - fbastien

17

在二维数组中计算一个值,以下是有用的代码片段来处理并计数特定值-

    <?php
    
    $list = [
      ['id' => 1, 'userId' => 5],
      ['id' => 2, 'userId' => 5],
      ['id' => 3, 'userId' => 6],
    ];

    $userId = 5;
    
    echo array_count_values(array_column($list, 'userId'))[$userId]; // outputs: 2
    

9

使用array_count_values函数。

$countValues = array_count_values($myArray);

echo $countValues["Ben"];


6

我知道这个,但它并没有给我想要的,它返回了所有相同元素的数量。 - Ivo San
@ivory-santos 你确定这个方法没有帮助吗?请查看此链接 http://codepad.org/Ye2x8uQD - swapnesh
@ivory-santos 这难道不是你想要的吗? - Alexander Larikov
不是真的 :) 我得到了答案,我不知道最近在计数后可以计算['Ben']。谢谢。 - Ivo San
@ivory-santos 一切都好 :) 这种事情发生了(至少从我的编程经验来看.. 哈哈) - swapnesh

5
define( 'SEARCH_STRING', 'Ben' );

$myArray = array("Kyle","Ben","Sue","Phil","Ben","Mary","Sue","Ben");

$count = count(array_filter($myArray,function($value){return SEARCH_STRING === $value;}));

echo $count, "\n";

输出:

3

2

1
如果您想要计算数组中所有相同的出现次数,这里有一个函数可以计算它们,并将结果作为多维数组返回:
function countSame($array) {

$count = count($array);
$storeArray = array();
while ($count > 0) {
$count--;

if ($array[$count]) {
$a = $array[$count];
$counts = array_count_values($array);
$counts = $counts[$a];
$tempArray = array($a, $counts);
array_push($storeArray, $tempArray);

$keys = array_keys($array, $a);
foreach ($keys as $k) {
unset($array[$k]);
} //end of foreach ($keys as $k)
} //end of if ($array[$count])

} //end of while ($count > 0)

return $storeArray;

} //end of function countSame($array)

1

1

array_count_values 只适用于整数和字符串。如果您需要浮点数/数值的计数(并且您不关心精度或表示中的小差异),可以使用以下方法:

function arrayCountValues($arr) {
  $vals = [];
  foreach ($arr as $val) { array_push($vals,strval($val)); }
  $cnts = array_count_values($vals);
  arsort($cnts);
  return $cnts;
}

请注意,我将使用字符串作为键来返回$cnts。重新转换它们很容易,但我正在尝试确定值的模式,因此只需要重新转换第一个(几个)值。
我测试了一个循环版本,创建了一个计数数组而不是使用array_count_values,结果效率更高(可能高出8-10%)!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接