I've got problems with some algo on a php array. Here is a kind of example of what I get after a grep on several logs files and store it in an array. It can be longer, each element is the result of a grep depending of the number of logs file in folder).
(
[0] => Array
(
[0] => : [POST] /api_v2/resources/new_service_indexes
[1] => : [POST] /api_v2/resources/new_service_tree_categories
[2] => : [POST] /api_v2/users/add_device
[3] => : [POST] /api_v2/users/check_email
)
[1] => Array
(
[0] => : [GET] /api_v2/resources/categories
[1] => : [POST] /api_v2/resources/new_service_indexes
[2] => : [POST] /api_v2/resources/new_service_tree_categories
[3] => : [POST] /api_v2/users/add_device
[4] => : [POST] /api_v2/users/check_email
[5] => : [POST] /api_v2/users/facebook_login
[6] => : [POST] /api_v2/users/login
[7] => : [POST] /api_v2/users/register
)
[2] => Array
(
[0] => : [POST] /api_v2/resources/new_service_indexes
[1] => : [POST] /api_v2/resources/new_service_tree_categories
[2] => : [POST] /api_v2/users/add_device
[3] => : [POST] /api_v2/users/facebook_login
[4] => : [POST] /api_v2/users/login
)
)
I want to count all key occurrences before deleting them and get a new array where there is unique key and the count. Example:
(
[name] => : [GET] /api_v2/resources/categories
[count] => : 2
[name] => : [POST] /api_v2/resources/new_service_indexes
[count] => : 3
[name] => : [POST] /api_v2/resources/new_service_tree_categories
[count] => : 5
[name] => : [POST] /api_v2/users/add_device
[count] => : 2
[name] => : [POST] /api_v2/users/check_email
[count] => : 2
[name] => : [POST] /api_v2/users/facebook_login
[count] => : 6
[name] => : [POST] /api_v2/users/login
[count] => : 2
[name] => : [POST] /api_v2/users/register
[count] => : 2
)
You can flatten the arrays and count the values:
$result = array_count_values(array_merge(...$array));
Should yield something like:
Array (
[ : [GET] /api_v2/resources/categories] => 2
[ : [POST] /api_v2/resources/new_service_indexes] => 3
)
The result array that you show isn't possible unless it's also two-dimensions. To do that:
foreach($result as $key => $val) {
$new_result[] = ['name' => $key, 'count' => $val];
}
But it would probably be easier just to merge the arrays while executing the grep
, but you don't show that code. You could ask another question with that code to get a better array format or this end result.
You can use array_count_values
with array_merge
and ...
splat operator to get the counts and then use array_walk
to build the desired array
$new = array_count_values(array_merge(...$a));
array_walk($new, function($v, $k) use (&$res){
$res[] = ['name' => $k, 'count' => $v];
});
Example: https://3v4l.org/1UqA8
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.