PHP – подсчет конкретных значений массива
как я могу непосредственно узнать, сколько «Бена» внутри?
$array = array("Kyle","Ben","Sue","Phil","Ben","Mary","Sue","Ben"); $counts = array_count_values($array); echo $counts['Ben'];
Используйте функцию array_count_values() . Проверьте эту ссылку http://php.net/manual/en/function.array-count-values.php
Используйте функцию array_count_values .
$ countValues = array_count_values ($ myArray);
Вы можете сделать это с помощью array_keys и подсчитать .
$array = array("blue", "red", "green", "blue", "blue"); echo count(array_keys($array, "blue"));
попробуйте функцию array_count_values ()
Array ( [1] => 2 [hello] => 2 [world] => 1 )
Попробуйте функцию PHP array_count_values .
Если вы хотите подсчитать ВСЕ те же вхождения внутри массива, вот функция, чтобы подсчитать их все и вернуть результаты в виде многомерного массива:
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)
с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)
define( 'SEARCH_STRING', 'Ben' ); $myArray = array("Kyle","Ben","Sue","Phil","Ben","Mary","Sue","Ben"); $count = count(array_filter($myArray,function($value))); echo $count, "\n";
array_count_values работает только для целых чисел и строк. Если вам посчастливилось подсчитывать значения float / numeric (и вы не учитываете небольшие вариации точности или представления), это работает:
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%)!
array_count_values
Функция array_count_values() возвращает массив, ключами которого являются значения массива array (которые должны быть целыми числами ( int ) или строками ( string )), а значениями — количество повторений значений array .
Список параметров
Массив подсчитываемых значений
Возвращаемые значения
Возвращает ассоциативный массив со значениями array в качестве ключей и их количества в качестве значений.
Ошибки
Генерирует ошибку уровня E_WARNING для каждого элемента, не являющегося строкой ( string ) или целым числом ( int ).
Примеры
Пример #1 Пример использования array_count_values()
Результат выполнения данного примера:
Array ( [1] => 2 [hello] => 2 [world] => 1 )
Смотрите также
- count() — Подсчитывает количество элементов массива или Countable объекте
- array_unique() — Убирает повторяющиеся значения из массива
- array_values() — Выбирает все значения массива
- count_chars() — Возвращает информацию о символах, входящих в строку
User Contributed Notes 7 notes
Simple way to find number of items with specific values in multidimensional array:
$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
?>
Here is a Version with one or more arrays, which have similar values in it:
Use $lower=true/false to ignore/set case Sensitiv.
$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»); // Possible with one or multiple Array
$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 ;
>
/*
Will print:
Array
(
[red] => 3
[green] => 3
[yellow] => 4
[blue] => 2
[brown] => 2
[white] => 1
[black] => 1
)
*/
?>
I couldn’t find a function for counting the values with case-insensitive matching, so I wrote a quick and dirty solution myself:
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 ); // Normal matching
$ar = array_icount_values ( $ar ); // Case-insensitive matching
print_r ( $ar2 );
print_r ( $ar );
?>
Array
(
[J. Karjalainen] => 3
[60] => 2
[j. karjalainen] => 1
[Fastway] => 2
[FASTWAY] => 1
[fastway] => 1
[YUP] => 1
)
Array
(
[J. Karjalainen] => 4
[60] => 2
[Fastway] => 4
[YUP] => 1
)
I don’t know how efficient it is, but it seems to work. Needed this function in one of my scripts and thought I would share it.
A cleaner way to use array_count_values() to find boolean counts.
$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 ];
// outputs: 2
?>
The case-insensitive version:
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 ;
>
?>
Based on sergolucky96 suggestion
Simple way to find number of items with specific *boolean* values in multidimensional array:
$list = [
[ ‘id’ => 1 , ‘result’ => true ],
[ ‘id’ => 2 , ‘result’ => true ],
[ ‘id’ => 3 , ‘result’ => false ],
];
$result = true ;
echo array_count_values ( array_map (function( $v ) , array_column ( $list , ‘result’ )))[ $result ]
// outputs: 2
array_count_values function does not work on multidimentional arrays.
If $score[][] is a bidimentional array, the command
«array_count_values ($score)» return the error message «Warning: Can only count STRING and INTEGER values!».
- Функции для работы с массивами
- array_change_key_case
- array_chunk
- array_column
- array_combine
- array_count_values
- array_diff_assoc
- array_diff_key
- array_diff_uassoc
- array_diff_ukey
- array_diff
- array_fill_keys
- array_fill
- array_filter
- array_flip
- array_intersect_assoc
- array_intersect_key
- array_intersect_uassoc
- array_intersect_ukey
- array_intersect
- array_is_list
- array_key_exists
- array_key_first
- array_key_last
- array_keys
- array_map
- array_merge_recursive
- array_merge
- array_multisort
- array_pad
- array_pop
- array_product
- array_push
- array_rand
- array_reduce
- array_replace_recursive
- array_replace
- array_reverse
- array_search
- array_shift
- array_slice
- array_splice
- array_sum
- array_udiff_assoc
- array_udiff_uassoc
- array_udiff
- array_uintersect_assoc
- array_uintersect_uassoc
- array_uintersect
- array_unique
- array_unshift
- array_values
- array_walk_recursive
- array_walk
- array
- arsort
- asort
- compact
- count
- current
- end
- extract
- in_array
- key_exists
- key
- krsort
- ksort
- list
- natcasesort
- natsort
- next
- pos
- prev
- range
- reset
- rsort
- shuffle
- sizeof
- sort
- uasort
- uksort
- usort
- each
array_count_values
array_count_values () возвращает массив, используя значения array качестве ключей и их частоту в array качестве значений.
Parameters
Массив значений для подсчета
Return Values
Возвращает ассоциативный массив значений из array как ключей и их количество как значение.
Errors/Exceptions
Выдает E_WARNING для каждого элемента , который не является строкой или внутр.
Examples
Пример # 1 array_count_values () Пример
$array = array(1, "hello", 1, "world", "hello"); print_r(array_count_values($array)); ?>
Выводится приведенный выше пример:
Array ( [1] => 2 [hello] => 2 [world] => 1 )
See Also
- count () — подсчитывает все элементы в массиве или в объекте Countable
- array_unique () — Удаляет повторяющиеся значения из массива
- array_values () — Возвращает все значения массива
- count_chars () — возвращает информацию о символах, используемых в строке
PHP 8.2
(PHP 5 5.5.0,7,8)array_column Возвращает значения из одиночного ввода array_column()возвращает значения из одиночного ввода,идентифицированного по ключу column_key.
(PHP 4 4.0.1,5,7,8)array_diff Вычисляет разность массивов Сравнивает массив с одним или несколькими другими массивами и возвращает значения,которые не присутствуют в массиве.
(PHP 4 4.3.0,5,7,8)array_diff_assoc Вычисляет разность массивов с дополнительной проверкой индексов Сравнивает массив с массивом и возвращает разность.