【发布时间】:2015-10-02 18:46:01
【问题描述】:
我有一个多维数组,我正在尝试对其进行排序,以便具有最多条目的数组排在第一位,等等......然后如果两个数组具有相同数量的条目,它们应该按字母顺序排列。此外,如果条目可以按“名称”键排序,我认为那会很棒。正如您在下面看到的,我使用 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);
我想用外行的话来说.. 按其“名称”值的字母顺序对条目进行排序应该是固有的。然后数组应该按条目数排序,如果任何数组具有相同的条目数,则应按字母顺序排序。
附: - 我正在寻求帮助,因为我很难理解多维数组(尤其是那些由 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
【问题讨论】:
-
按字母顺序排列两个数组是什么意思?你能显示示例输入和所需的输出吗?
-
返回的数组 ldap_search 是我认为的多维关联数组。数组里面有数组,值可以用数字或字符串来识别。
-
请发布
var_export($search);的输出,以便我们查看该数组的外观并用它测试我们的答案。 -
您仍然不清楚按字母顺序排列两个数组的含义。如果数组是
["c", "a", "b"]和["b", "d", "e"],哪个先出现?第一个是因为它的最低元素是"a",还是第二个是因为"b"低于"c"?[ -
你应该可以用
usort()做你想做的事。您编写了一个比较函数,它返回给定两个输入数组的适当排序,它会对包含它们的多维数组进行排序。