在多维数组中查找具有特定值的项目的数量的简单方法
<?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]; // 输出:2
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
array_count_values — 统计数组中每个不同值的出现次数
array
要统计的值数组
返回一个关联数组,其中 array
的值作为键,它们的计数作为值。
示例 #1 array_count_values() 示例
<?php
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));
?>
上面的示例将输出
Array ( [1] => 2 [hello] => 2 [world] => 1 )
在多维数组中查找具有特定值的项目的数量的简单方法
<?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]; // 输出:2
?>
这里有一个版本,其中包含一个或多个数组,这些数组具有类似的值
使用 $lower=true/false 来忽略/设置大小写敏感性。
<?php
$ar1[] = array("red","green","yellow","blue");
$ar1[] = array("green","yellow","brown","red","white","yellow");
$ar1[] = array("red","green","brown","blue","black","yellow");
#$ar1= array("red","green","brown","blue","black","red","green"); // 可以使用一个或多个数组
$res = array_icount_values ($ar1);
print_r($res);
function array_icount_values($arr,$lower=true) {
$arr2=array();
if(!is_array($arr['0'])){$arr=array($arr);}
foreach($arr as $k=> $v){
foreach($v as $v2){
if($lower==true) {$v2=strtolower($v2);}
if(!isset($arr2[$v2])){
$arr2[$v2]=1;
}else{
$arr2[$v2]++;
}
}
}
return $arr2;
}
/*
将打印:
Array
(
[red] => 3
[green] => 3
[yellow] => 4
[blue] => 2
[brown] => 2
[white] => 1
[black] => 1
)
*/
?>
我找不到一个函数来计算不区分大小写的匹配的值,所以我自己写了一个快速而脏的解决方案
<pre><?php
function array_icount_values($array) {
$ret_array = array();
foreach($array as $value) {
foreach($ret_array as $key2 => $value2) {
if(strtolower($key2) == strtolower($value)) {
$ret_array[$key2]++;
continue 2;
}
}
$ret_array[$value] = 1;
}
return $ret_array;
}
$ar = array('J. Karjalainen', 'J. Karjalainen', 60, '60', 'J. Karjalainen', 'j. karjalainen', 'Fastway', 'FASTWAY', 'Fastway', 'fastway', 'YUP');
$ar2 = array_count_values($ar); // 普通匹配
$ar = array_icount_values($ar); // 不区分大小写的匹配
print_r($ar2);
print_r($ar);
?></pre>
这将打印
数组
(
[J. Karjalainen] => 3
[60] => 2
[j. karjalainen] => 1
[Fastway] => 2
[FASTWAY] => 1
[fastway] => 1
[YUP] => 1
)
数组
(
[J. Karjalainen] => 4
[60] => 2
[Fastway] => 4
[YUP] => 1
)
我不知道它效率如何,但它似乎有效。我需要在我的一个脚本中使用这个函数,所以我想分享一下。
以上仍然会产生“数组到字符串转换”的通知。
请尝试
[code]->select('DISTINCT '.$db->quoteName('name_group'))[code]
array_count_values 函数不适用于多维数组。
如果 $score[][] 是一个二维数组,则命令
"array_count_values ($score)" 会返回错误消息“警告:只能计算 STRING 和 INTEGER 值!”。
一种更清晰的方式使用 array_count_values() 来查找布尔值计数。
<?php
$list = [
['id' => 1, 'result' => true],
['id' => 2, 'result' => true],
['id' => 3, 'result' => false],
];
$result = true;
echo array_count_values(array_map('intval', array_column($list, 'result')))[(int)$result];
// 输出:2
?>
基于 sergolucky96 的建议
简单的方法来查找多维数组中具有特定 *布尔* 值的项目的数量
<?php
$list = [
['id' => 1, 'result' => true],
['id' => 2, 'result' => true],
['id' => 3, 'result' => false],
];
$result = true;
echo array_count_values(array_map(function($v) {return $v?'true':'false';},array_column($list, 'result')))[$result]
// 输出:2
?>
不区分大小写的版本
<?php
function array_count_values_ci($array) {
$newArray = array();
foreach ($array as $values) {
if (!array_key_exists(strtolower($values), $newArray)) {
$newArray[strtolower($values)] = 0;
}
$newArray[strtolower($values)] += 1;
}
return $newArray;
}
?>
如果你有一个未知维度的多维数组,你不能使用这个函数,请改为使用
<?php
function array_count_recursive(array $arr): array {
$occurrences = [] ;
array_walk_recursive( $arr, function($value, $key) use (&$occurrences) {
@ $occurrences[$value]++;
// @ 用于抑制警告“未定义的数组键”。在 php8 中,你也可以使用
// $occurrences[$value] = ($occurrences[$value] ?? 0) + 1
});
return $occurrences;
}
?>