Search code examples
phparrayssortingfrequency

Sort elements by frequency in PHP


Input:

$result = Array
    (
        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "ლუკა ქურასბედიანი",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ),

       Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ), 
        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),
        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),
        Array(
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ),

    );

I want sort elements by frequency (by "parrent_club_hash_id" ).

There are 11-x 7-y and 5-z so i want output like this:

$result = Array
    (
        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "ლუკა ქურასბედიანი",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

       Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "x",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "y",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ),

        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ), 
        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ),
        Array
            (
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ),
        Array(
                "name" => "",
                "squad_member_hash_id" => "",
                "parrent_club_hash_id" => "z",
            ),

    );

Solution

  • First get the frequencies of your values:

    $values = array_count_values(array_column($result, 'parrent_club_hash_id'));
    

    Then sort by those frequencies using a custom sort:

    usort($result, function ($x, $y) use ($values) {
        // $y is first because you need descending sort
        return $values[$y["parrent_club_hash_id"]] - $values[$x["parrent_club_hash_id"]];
    });
    

    Example: http://sandbox.onlinephpfunctions.com/code/6265192e677641afbc21e899d97f252c14b5402f