2017-10-03 7 views
3

Comment je peux trier un tableau avec des millions de valeurs par des lettres spécifiées dans le tableau efficacement avec une perte de temps minimale.Comment trier un grand tableau en fonction de l'alphabet spécifié dans le tableau avec une perte de temps minimale?

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

Fonction simple pour trier un tableau par une clé spécifique. Maintient l'association d'index. Cette fonction trie également le tableau, mais pas dans mon alphabet, mais dans l'alphabet anglais (fonctionne mieux en lettres anglaises).

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

) 
*/ 

?> 

Une autre tri variant en valeur:

<?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 

) 
*/ 

>

Mon tableau exemple pour le tri:

<?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] => ҷаҳонишиносӣ 
); 
?> 

Ce résultat ne tri par mon aplphabet du tableau:

<?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] => ҳурматой 
    ) 
    */ 
?> 

Répondre

3

Vous pouvez utiliser cette fonction pour trier les valeurs du tableau par un ordre de caractère, que vous devez fournir comme second argument:

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

Tout comme les fonctions standard de PHP, il trie le tableau en place.

Voici comment vous l'utiliser:

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

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

customSort($arr, $charOrder); 

Après avoir exécuté l'exemple ci-dessus, $arr aura ce contenu:

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

Vous utilisez le retour "1" quand je l'utilise @trincot. Avez-vous vérifié la fonction pour la performance? Si oui, donnez-moi un lien pour que je puisse le regarder. – John

+0

La fonction renvoie 'true', tout comme la fonction standard' sort'. Le tableau passé en argument est * muté * par la fonction, et sortira trié. C'est le comportement standard des fonctions de tri en PHP. La performance devrait être bonne, mais ne peut pas battre les méthodes de tri basées sur les paramètres régionaux intégrés en PHP. La fonction prend-elle trop de temps pour vous? – trincot

+1

J'ai array avec 9000000 valeurs et la fonction est légèrement retardée et cette fonction peut être un peu plus rapide? – John

1

Vous pouvez utiliser le sort function avec le deuxième paramètre car vous voulez que la chaîne soit triée pas en anglais. Un exemple pourrait être

setlocale("LC_ALL", "fr_FR.utf8"); 
sort($arraytobesorted, SORT_LOCALE_STRING); 

Ici vous pouvez changer selon votre langue, j'ai utilisé le français comme exemple.

+0

je changé ma question et vous avez testé réponse, mais le résultat est ce que je veux @Rohit Ailani – John

+0

ok pouvez-vous également donner la sortie désirée dont vous avez besoin. –

+0

Voir à la question, il est mis à jour. – John