【问题标题】:PHP Sort Multidimensional Array By Number Of Entries - If Equal AlphabeticalPHP按条目数对多维数组进行排序-如果字母相等
【发布时间】: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()做你想做的事。您编写了一个比较函数,它返回给定两个输入数组的适当排序,它会对包含它们的多维数组进行排序。

标签: php html ldap


【解决方案1】:

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

【讨论】:

  • 等等.. 我想我误解了你。我正在尝试按它们拥有的条目数对位置进行排序,如果它们具有相同数量的条目,那么它们应该按位置的字母顺序排序。条目本身(对于每个位置)应始终按“名称”按字母顺序排序。
猜你喜欢
  • 2011-07-28
  • 2011-10-31
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2018-03-09
相关资源
最近更新 更多