時間の無駄を最小限に抑えながら、配列で指定された文字で100万個の値を持つ配列を効果的に並べ替える方法。
$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] => ҳурматой
)
*/
?>
この関数を使用して、配列値を任意の文字順序で並べ替えることができます。これは、2番目の引数として指定する必要があります。
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 (
'адолат',
'ғайрат',
'забони тоҷикӣ',
'карим',
'маъруфҷон',
'рустам',
'тоҷикӣ',
'ӯктамҷон',
'ҳурматой',
)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加