PHP按条目数排序多维数组-如果等于字母顺序


PHP Sort Multidimensional Array By Number Of Entries - If Equal Alphabetical

我有一个多维数组,我正试图对它进行排序,以便具有最多条目的数组首先出现,等等…然后,如果两个数组有相同数量的条目,它们应该按字母顺序排列。此外,如果条目可以按键"名称"排序,我认为那将是伟大的。如下所示,我使用ldap_sort按'name'排序。但是我确信调用太多的排序函数是不好的做法。

if ($conn == True ) {
    Try {
        // Authenticate
        $bind = ldap_bind($conn, $user, $pass);
        // Search AD
        $search = ldap_search($conn, $dn, $filter, $attr);
        // Sort
        ldap_sort($conn, $search, 'name');
        // Retrieve Data
        $records = ldap_get_entries($conn, $search);
        Foreach ($records as $record) {
            if(is_array($record) && array_key_exists('l', $record)) {
                $locations[$record['l'][0]][] = $record;
            }
            continue;
        }
    } finally {
        // Close Connection
        ldap_close($conn);
    }
} else {
    trigger_error('Unable_To_Connect_To_Server');
}
// Sort Location By Number Of Entries
array_multisort(array_map('count', $locations), SORT_DESC, $locations);
我想用外行的话来说……按"name"值按字母顺序排序条目应该是固有的。然后数组应按条目数排序,如果任何数组具有相同的条目数,则应按字母顺序排序。

注:-我正在寻求帮助,因为我很难理解多维数组(特别是那些由ldap_search返回的数组),对它们进行排序对我来说更是令人难以置信。

EDIT就像我说的,数组让我感到困惑,但希望下面能准确地描述我的意图:

Array ( 
    [Location1] => Array ( 
        [0] => Array ( 
            [l] => Array ( 
                [count] => 1 
                [0] => Location1
            ) 
            [0] => l 
            [telephonenumber] => Array ( 
                [count] => 1 
                [0] => XXX.XXX.XXXX
            ) 
            [1] => telephonenumber 
            [department] => Array ( 
                [count] => 1 
                [0] => Department1
            ) 
            [2] => department 
            [name] => Array ( 
                [count] => 1 [0] => User1
            ) 
            [3] => name 
            [ipphone] => Array ( 
                [count] => 1 
                [0] => IPPhone1
            ) 
            [4] => ipphone 
            [mail] => Array ( 
                [count] => 1 
                [0] => user@domain.com
            ) 
            [5] => mail 
            [count] => 6 
            [dn] => DistinguishedName1
        )
    )
)

我缩短了上面的内容(有数百条记录返回),我不确定我是否正确结束了它。但是我实际上是在解析信息以输出如下所示的内容:

c_Location1
   a_user1
   b_user1
   c_user1
a_Location2
   a_user2
   b_user2
b_location3
   a_user3
   b_user3

编写一个比较数组长度的函数。如果它们是相同的,它比较name项。作为usort的回调函数

usort($records, function($x, $y) {
    if (count($x) == count($y)) {
        $u1 = $x['name'][0];
        $u2 = $y['name'][0];
        return $u1 < $u2 ? -1 :
            ($u1 > $u2 ? 1 : 0);
    } else {
        return count($y) - count($x);
    }
});