|
我如何用數(shù)組中指定的字母有效地對具有百萬個(gè)值的數(shù)組進(jìn)行排序,而又不會(huì)浪費(fèi)時(shí)間.
$letters = array(
"а","б", "в", "г", "?", "д", "е", "ё", "?", "ж", "з", "и", "?", "й", "к", "?", "л", "м", "н", "о", "п", "р", "с", "т", "у", "?", "ф", "х", "?", "ч", "ш", "ъ", "э", "ю", "я"
);
通過特定鍵對數(shù)組排序的簡單函數(shù).維護(hù)索引關(guān)聯(lián).此函數(shù)還對數(shù)組進(jìn)行排序,但不是按字母排序,而是按英語字母排序(在英語字母中效果更好).
<?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
)
)
*/
?>
另一個(gè)按值排序的變體:
<?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
)
*/
?>
我的示例數(shù)組用于排序:
<?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] => ?а?онишинос?
);
?>
此結(jié)果未按我的頂點(diǎn)排序從數(shù)組排序:
<?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] => ?урматой
)
*/
?>
解決方法: 您可以使用此函數(shù)按任何字符順序?qū)?shù)組值進(jìn)行排序,這需要作為第二個(gè)參數(shù)提供:
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);
}
就像標(biāo)準(zhǔn)的PHP函數(shù)一樣,它對數(shù)組進(jìn)行原位排序.
這是您將如何使用它:
$charOrder = [
"а","б", "в", "г", "?", "д", "е", "ё", "?", "ж", "з", "и", "?", "й", "к", "?", "л", "м", "н", "о", "п", "р", "с", "т", "у", "?", "ф", "х", "?", "ч", "ш", "ъ", "э", "ю", "я"
];
// Sample unsorted array
$arr = [
"?ктам?он",
"?айрат",
"маъруф?он",
"рустам",
"карим",
"?урматой",
"то?ик?",
"забони то?ик?",
"адолат"
];
customSort($arr, $charOrder);
運(yùn)行上面的示例后,$arr將具有以下內(nèi)容:
array (
'адолат',
'?айрат',
'забони то?ик?',
'карим',
'маъруф?он',
'рустам',
'то?ик?',
'?ктам?он',
'?урматой',
)
來源:https://www./content-1-521001.html
|