如何以最少的时间损失,根据数组中指定的字母表对一个大数组进行排序?

2024-02-05

如何以最少的时间浪费有效地按数组中指定的字母对具有百万个值的数组进行排序。

$letters = array(
"а","б", "в", "г", "ғ", "д", "е", "ё", "ҷ", "ж", "з", "и", "ӣ", "й", "к", "қ", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ӯ", "ф", "х", "ҳ", "ч", "ш", "ъ", "э", "ю", "я"
); 

按特定键对数组进行排序的简单函数。维护索引关联。该函数还对数组进行排序,但不是按我的字母表排序,而是按英文字母表排序(在英文字母中效果更好)。

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

$people = array(
    12345 => array(
        'id' => 12345,
        'first_name' => 'Joe',
        'surname' => 'Bloggs',
        'age' => 23,
        'sex' => 'm'
    ),
    12346 => array(
        'id' => 12346,
        'first_name' => 'Adam',
        'surname' => 'Smith',
        'age' => 18,
        'sex' => 'm'
    ),
    12347 => array(
        'id' => 12347,
        'first_name' => 'Amy',
        'surname' => 'Jones',
        'age' => 21,
        'sex' => 'f'
    )
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

/*
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
*/

?>

另一种按值排序的变体:

<?php 
$data = array(
"US" => "United States", 
"IN" => "India", 
"DE" => "Germany", 
"ES" => "Spain"
);

asort($data); 
print_r($data);
/*
Array ([DE] => Germany

[IN] => India

[ES] => Spain

[US] => United States

) 
*/

?>

我的排序示例数组:

<?php
Array
(
    [0] => дувоздаҳҳазорсоларо
    [2] => мусовиулқувваро
    [3] => фарҳангшиносону
    [6] => илоҳиётшиносони
    [7] => сарнавиштпазирӣ
    [14] => сангнабиштаҳое
    [15] => илоҳиётшиносон
    [16] => музаффариятҳои
    [18] => минтақатулбурҷ
    [20] => фарҳангномаҳои
    [21] => парастишгоҳҳое
    [22] => кишваркушоиҳои
    [23] => парастишгоҳҳои
    [24] => фарҳангшиносон
    [26] => таҷъирнопазир
    [29] => илҳодшиносони
    [30] => сангнабиштаҳо
    [31] => сангнабиштҳои
    [32] => гумроҳкунанда
    [34] => байнаннаҳрайн
    [35] => наанҷомидааст
    [38] => парҳезкоронаи
    [39] => меҳрпарастист
    [42] => дареҷухвазата
    [45] => лашкаркашиҳои
    [47] => мовароуттабиӣ
    [49] => дастнахӯрдагӣ
    [51] => шаҳватпарастӣ
    [53] => аввалиндараҷа
    [56] => меҳрпарастиву
    [57] => ҷаҳоншиносиро
    [58] => меҳрпарастиро
    [60] => зарвонпарастӣ
    [62] => ҳастишиносиву
    [63] => муҳоҷираташон
    [65] => пажӯҳандагон
    [66] => бавуҷудомада
    [67] => ситорашиносӣ
    [72] => нӯҳҳазорсола
    [74] => аҳуромаздост
    [75] => ҷаҳонишиносӣ
);
?>

这个结果没有按我的 aplphabet 从数组中排序:

<?php
    $array = array (
        "ӯктамҷон",
        "ғайрат",
        "маъруфҷон",
        "рустам",
        "карим",
        "ҳурматой",
        "тоҷикӣ",
        "забони тоҷикӣ",
        "адолат"
    );


    echo "<pre>";
        print_r($array);
    echo "</pre>";

    /*
    Array
    (
        [0] => ӯктамҷон
        [1] => ғайрат
        [2] => маъруфҷон
        [3] => рустам
        [4] => карим
        [5] => ҳурматой
        [6] => тоҷикӣ
        [7] => забони тоҷикӣ
        [8] => адолат
    )
    */

    setlocale(LC_ALL, "tg-Cyrl-TJ"); 
    sort($array, SORT_LOCALE_STRING);

    echo "<pre>";
        print_r($array);
    echo "</pre>";

    /*
    Array
    (
        [0] => адолат
        [1] => забони тоҷикӣ
        [2] => карим
        [3] => маъруфҷон
        [4] => тоҷикӣ
        [5] => рустам
        [6] => ғайрат
        [7] => ҳурматой
        [8] => ӯктамҷон
    )
    */

    /*  Result must be:
    Array
    (
        [0] => адолат
        [1] => ғайрат
        [2] => забони тоҷикӣ
        [3] => карим
        [4] => маъруфҷон
        [5] => рустам
        [6] => тоҷикӣ
        [7] => ӯктамҷон
        [8] => ҳурматой
    )
    */
?>

您可以使用此函数按任何字符顺序对数组值进行排序,您需要将其作为第二个参数提供:

function customSort(&$arr, $charOrder) {
    $mappedChar = $charOrder;
    sort($mappedChar);
    $mapping = array_combine($charOrder, $mappedChar);
    foreach($arr as $str) {
        $mapped[] = strtr($str, $mapping);
    }
    return array_multisort($mapped, $arr);
}

就像标准 PHP 函数一样,它对数组进行排序in-place.

以下是您将如何使用它:

$charOrder = [
"а","б", "в", "г", "ғ", "д", "е", "ё", "ҷ", "ж", "з", "и", "ӣ", "й", "к", "қ", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ӯ", "ф", "х", "ҳ", "ч", "ш", "ъ", "э", "ю", "я"
];

// Sample unsorted array
$arr = [
        "ӯктамҷон",
        "ғайрат",
        "маъруфҷон",
        "рустам",
        "карим",
        "ҳурматой",
        "тоҷикӣ",
        "забони тоҷикӣ",
        "адолат"
    ];

customSort($arr, $charOrder);

运行上面的例子后,$arr会有这样的内容:

array (
  'адолат',
  'ғайрат',
  'забони тоҷикӣ',
  'карим',
  'маъруфҷон',
  'рустам',
  'тоҷикӣ',
  'ӯктамҷон',
  'ҳурматой',
) 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以最少的时间损失,根据数组中指定的字母表对一个大数组进行排序? 的相关文章

  • 将数组字段组合成单个数组字段 mongo

    我正在使用 mongo 版本 3 4 3 我的文档存储在 mongo 中 如下所示 id ObjectId 5ad5ab8aaf2808b739ba6ab2 ResumeId 105839064 ResumeDetails WorkProf
  • 模块化算术和 NTT(有限域 DFT)优化

    我想使用 NTT 进行快速平方 参见快速大数平方计算 https stackoverflow com q 18465326 2521214 但即使对于非常大的数字 结果也很慢 超过 12000 位 所以我的问题是 有没有办法优化我的 NTT
  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • Ajax文件上传

    我想使用 Ajax 和 php 上传文件 我有一个表格
  • 检查字符串是否是哈希值

    我正在使用 SHA 512 来散列我的密码 当然还有盐 我认为我想要的不可能 但无论如何我们还是要问一下 有没有办法检查字符串是否已经是 SHA 512 或其他算法 哈希值 当用户登录时 我想检查他的密码 如果它仍然是纯文本 则应将其转换为
  • 纯基于网络的版本控制系统

    我的托管服务当前不允许在其服务器上运行 允许 svn git cvs 我真的希望能够将我的开发计算机上的当前源代码与我的生产服务器 同步 我正在寻找一个纯php python ruby版本控制系统 不只是一个client对于版本控制系统 不
  • 从 php 到 JavaScript 的数组

    我正在尝试使用 json 将数组列表从 php 传输到 javascript 但它不起作用 JS ajax url getProfilePhotos php type post post or get method data if you
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • Redim Preserve 给出“下标超出范围”

    我想要Redim Preserve一个数组我不断收到错误 下标超出范围 我知道只有最后一个维度的大小可以更改 这正是我正在做的事情 这里出了什么问题 数组的类型是Variant BmMatrix Sheets BENCH Range a60
  • php oracle客户端oci8安装出现什么问题

    我尝试了安装 PHP Oracle 客户端的所有过程 1 我安装了客户端版本8和32位 2 我在php ini中取消了oci的注释 3 重新启动Wamp 4 不确定是否真的安装 但我在 php ini 中得到了引用 5 但仍然无法连接 泰汉
  • Paypal 将钱从一个帐户转移到另一个帐户

    我知道这个建议如何汇款至任何 PayPal 账户 https stackoverflow com questions 1559808 paypal api send money to any paypal account但到目前为止我所尝试
  • PHP Intl 扩展线程安全吗?

    我一直在阅读有关 PHP 中的语言环境的内容 看起来setlocale 线程有问题 我对线程不太熟悉 文档提到它不是线程安全的 我想让我的项目能够处理某些数字格式 并且 Intl 扩展似乎很有趣 http php net manual en
  • 使(文本到图像)图像具有一定的宽度但无限的长度?

    我有下面的代码 可以用大量文本生成图像 我希望该图像的宽度为 700 像素 我还希望它保留字符串所具有的段落结构 该字符串来自 MySQL 数据库 我怎样才能实现这一点 font 2 width imagefontwidth font st
  • ACL授权失败后ZF3重定向

    我有一个带有 ACL 的新 ZF3 应用程序 现在 我需要在未经授权的访问的情况下重定向到错误页面 例如 403 我认为最好的方法是触发一个事件 然后捕获它 但我失败了 全部都在我的用户模块中Module php 摘录 namespace
  • 使用 file_get_content 发布数据

    我已经做了一些关于如何使用的研究file get content与帖子 我也读过this one https stackoverflow com questions 2445276 how to post data in php using
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 使用 ImageMagick (PHP) 将 2 个图像并排合并为 1 个图像

    我认为这是一件容易的事 我有 2 张图片 JPG 我希望它们合并成一张图片 其中 2 张图片并排 所以我有图片 A 和图片 B 我想要图片 AB 并排 两个图像具有相同的宽度和高度 在本例中 宽度 200px 高度 300px 但是第二个图
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • Readfile 从大文件中读取 0 字节?

    我正在尝试通过以下方式发送一个大文件readfile 但是 没有任何内容发送到浏览器 并且readfile 回报0 not false 我尝试发送的文件大小为 4GiB 并且可由 PHP 读取 我正在设置set time limit 0 以
  • 通过 Sparkpost 发送 iCal 邀请

    我正在尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请 但收到电子邮件后邀请不会打开 我使用两个文件 calendarinvite php 来创建邀请 使用 Sendemail php 来发送电子邮件 calendarinv

随机推荐

  • 如何将样式应用于嵌入的 SVG?

    当使用 SVG 直接包含在文档中时
  • Mac App开发:“***.app”已损坏且无法打开

    我有一个 Mac 应用程序 我已经有一段时间没有碰过它了 现在 自 macOS Catalina 以来 与 Mac App Store 集成运行应用程序的情况似乎发生了变化 https stackoverflow com q 5867337
  • 如何在 PHP 中 GET 或 POST 多部分数据请求

    我正在从 iOS 发送多部分请求以在服务器上上传图像或文档文件 我的要求就像 UIImage im UIImage imageNamed 57X57 png NSData imageData UIImageJPEGRepresentatio
  • 需要使用范围进行嵌套连接的 ActiveRelation

    我是 Rails 新手 玩得很开心 查询 API 给了我 有些麻烦 我一直在快速地缩放并做很多事情 但这是我第一次花几个小时试图弄清楚 它不像我以前使用过的任何东西 常规 SQL 或 Hibernate 管他呢 我的模型非常简单 私人消息有
  • 是否有用于标头(h1、h2、h3、h4、h5 或 h6)的 jQuery 选择器?

    jQuery 中似乎没有办法判断一个节点是否是标题 即 h1 h2 h3 h4 h5 或 h6 我想写一些类似的东西 hNode node closest h if hNode length gt 0 hNode css padding t
  • random_number() 如何并行工作?

    如何random number 与 OpenMP 并行工作吗 如果我在没有并行化的情况下运行程序 我总是得到相同的结果 但是通过并行化 我每次都会得到不同 但相似 的结果 不保证线程安全或线程性能random number一般来说 Fort
  • 在hadoop java中解析json输入

    我的输入数据位于 hdfs 中 我只是想进行字数统计 但有细微的差别 数据为json格式 所以每行数据为 author foo text hello author foo123 text hello world author foo234
  • 通过链接 2 列设置 R data.table 行顺序

    我试图弄清楚如何根据 2 列的链接对 R 数据表进行排序 这是我的示例数据表 dt lt data table id c A A A A A col1 c 7521 0 7915 5222 5703 col2 c 7907 5703 800
  • CommaIde 上未声明子例程“say”

    我用 CommaIde 打开了这个简单的脚本 usr bin env perl6 my str foobar say str IDE 突出显示单词 say 并显示错误 子程序说未定义 但是 如果我执行该脚本 它运行正常 其他核心方法 如 p
  • 在python中将二进制整数写入文件

    如何在 Python 3 中将整数写入二进制文件 例如 我想将 6277101735386680763835789423176059013767194773182842284081 以恰好 24 个字节的二进制格式写入文件 无符号 我只会使
  • 如果调用 fclose(0),这会关闭标准输入吗?

    如果调用 fclose 0 这会关闭标准输入吗 我问这个问题的原因是由于某种原因 stdin 在我的应用程序中被关闭 我不明白为什么 我检查了 fclose stdin 但这不在应用程序中 所以我想知道 fclose 0 是否会导致未定义的
  • 仍然对 Objective-C 的动态绑定感到困惑

    这个问题来自我刚刚添加到答案中的评论这个问题 https stackoverflow com questions 6608551 question about dynamic binding objective c and methods
  • 看起来我正在实例化这个 SpeechAPI 接口。这怎么可能?

    我在我的项目中使用 Microsoft 文本到文本语音功能 但我对此有一个问题 实际上不是直接的问题 所以 通常程序员在创建接口时 他们会将 I 作为接口名称的前缀 如 IReadable IEnumerator 等 但我遇到过一些让我震惊
  • Unity 2D:区域颜色反转效果

    我正在尝试创建一个 GameObejct 如果处于活动状态 则会反转其后面任何内容的颜色 理想情况下 当该游戏对象出现 变为活动状态时 它会从其中心点扩展到一定大小的半径 因此 想象一个圆 其比例在 1 或 2 秒内逐渐从 x 0 和 y
  • 如何排除模板文字类型的子字符串?

    我想从模板文字类型 自 TypeScript 4 1 起可用 中排除一些子字符串 但我不知道是否可能 Example 我可以定义一个类型说 这个字符串是一个包含 2 个或更多元素的元组 即类似的东西 string number 使用这个文字
  • Symfony 2 - 在 ROLE_USER 下添加用户角色

    我正在尝试在 Symfony 2 中的默认 USER ROLE 下创建一个新角色 该角色对某些功能的写访问权限有限 我正在使用 FOSUserBundle 到目前为止 我已经编写了以下安全设置 但我的 ROLE DEMO 用户仍然获得 RO
  • Rails 时区问题

    这是我的控制台 irb main 048 0 gt Time now gt 2011 04 13 00 51 50 0200
  • Python ctypes 和动态链接

    我正在用 C 编写一些库 其中包含我想通过 ctypes 从 Python 调用的函数 我已经在另一个库中成功完成了此操作 但是该库只有非常普通的依赖项 即fstream math malloc stdio stdlib 我正在开发的另一个
  • 如何要求 XSD.exe 为我生成正确的类,以便我可以创建良好的 XML

    我从 Visual Studio 2010 创建了一个 XSD 文件 然后我用xsd c mydemo xsd为我生成类 以便我可以在运行时创建 XML 文件 但是 当我使用该类 填充一些值并序列化该对象时 XML 文件对我来说看起来不太好
  • 如何以最少的时间损失,根据数组中指定的字母表对一个大数组进行排序?

    如何以最少的时间浪费有效地按数组中指定的字母对具有百万个值的数组进行排序 letters array 按特定键对数组进行排序的简单函数 维护索引关联 该函数还对数组进行排序 但不是按我的字母表排序 而是按英文字母表排序 在英文字母中效果更好