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

标签 php arrays performance sorting

我如何根据数组中指定的字母有效地对具有百万值的数组进行排序,同时最大限度地减少时间浪费。

$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 函数一样,它就地对数组进行排序。

以下是您将如何使用它:

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

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

customSort($arr, $charOrder);

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

array (
  'адолат',
  'ғайрат',
  'забони тоҷикӣ',
  'карим',
  'маъруфҷон',
  'рустам',
  'тоҷикӣ',
  'ӯктамҷон',
  'ҳурматой',
) 

关于php - 如何根据数组中指定的字母表以最少的时间损失对大型数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46537875/

相关文章:

php - 多重核算

c - sizeof 参数

C 段错误

php - 根据选择框选项用 MySQL 值填充其他文本输入

PHP - 从其他域发送电子邮件而不是垃圾邮件!

arrays - 如何在numpy中创建连续数字数组?

performance - (V^2 + E) 和 (E log V) 哪个时间复杂度更快

c++ - virtual 关键字与 *derived* 类中的函数对性能的影响

字符向量的随机样本,元素之间没有前缀

php - dns_get_record 查询失败