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

时间:2015-10-02 18:46:01

标签: php html ldap

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

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);

我想把它作为外行人的条款。按照他们的名字按字母顺序排序条目'价值,应该是固有的。然后,数组应按条目数排序,如果任何数组具有相同数量的条目,则应按字母顺序排序。

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

编辑就像我说的那样,阵列让我感到困惑,但希望以下内容准确地描述了我的意图:

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

1 个答案:

答案 0 :(得分:0)

编写一个比较数组长度的函数。如果它们相同,则会比较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);
    }
});