简体   繁体   中英

Count similar values in php array of array and add unique in a new array

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM