2017-10-03 4 views
3

どのように最小限の時間で配列に指定された文字で百万の値を持つ配列を効果的に並べ替えることができますか?配列に指定されたアルファベットに従って大きな配列をソートするにはどうすればよいですか?

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

答えて

3

:ちょうど標準のPHPの関数のように

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

、それはその場で配列をソート。ここで

は、あなたがそれを使用する方法である:

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

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

customSort($arr, $charOrder); 

上記の例を実行した後、$arrこのコンテンツを持っています:

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

@trincotを使用すると、関数は "1"を返します。あなたはパフォーマンスのための機能をチェックしましたか?もしそうなら、私はそれを見ることができるように私にリンクを与えてください。 – John

+0

この関数は、標準の 'sort'関数と同様に' true'を返します。引数として渡された配列は関数によって*変更*され、ソートされます。これは、PHPのソート関数の標準的な動作です。パフォーマンスは良いはずですが、組み込みのロケールベースのソート方法をPHPで打ち破ることはできません。関数はあなたには長すぎますか? – trincot

+1

私は9000000の値を持つ配列を持っていますが、関数は少し遅れていて、この関数は少し速くなりますか? – John

1

sort functionに2番目のパラメータを使用すると、文字列を英語で並べ替えることができます。例はあります

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

ここではフランス語を例として使用しています。あなたが2番目の引数として提供する必要がある任意の文字の順序で配列の値をソートするために、この機能を使用することができます

+0

を私は私の質問を変更し、あなたが答えるテストしたが、結果はではありません私が欲しいもの@Rohit Ailani – John

+0

okあなたは必要な出力を与えることもできます。 –

+0

質問するには、更新してください。 – John

関連する問題