用PHP对带有特殊字符的数组进行排序

5

我知道这个问题已经被问过很多次了,但是我还是找不到可靠的解决方案。

以下是需要按字母顺序排序的数组。

setlocale(LC_ALL, 'sl_SI.utf8');

$a = [
   'č' => [...],  
   'a' => [...],
   'š' => [...], 
   'u' => [...] 
]

我该如何按键排序呢?

它会输出这个:https://eval.in/990861,你想要什么样的输出? - Niklesh Raut
我希望按照键[a => [], č => [], š => [], u => []]进行排序。 - Tim
2个回答

5
参考此示例:- 使用PHP对具有特殊字符的数组进行排序 解释:
  1. 使用array_keys()方法获取数组键
  2. 基于iconv()strcmp()函数对键进行排序
  3. 遍历已排序的键数组并从初始数组中获取它们对应的值。将这个键值对保存到结果数组中
请按以下方式执行:
<?php

setlocale(LC_ALL, 'sl_SI.utf8');

$a = [
   'č' => [12],  
   'a' => [23],
   'š' => [45], 
   'u' => [56] 
];


$index_array = array_keys($a);

function compareASCII($a, $b) {
    $at = iconv('UTF-8', 'ASCII//TRANSLIT', $a);
    $bt = iconv('UTF-8', 'ASCII//TRANSLIT', $b);
    return strcmp($at, $bt);
}

uasort($index_array, 'compareASCII');

$final_array = [];
foreach($index_array as $index_arr){

$final_array[$index_arr] = $a[$index_arr];
}

print_r($final_array);

输出:- https://eval.in/990872

参考:-

iconv()

strcmp()

uasort


3
sort($index_array, SORT_LOCALE_STRING);怎么样?为什么使用iconv()strcmp()进行比较更好呢? :-) - Philipp Maurer
1
这个可行!现在我尝试使用ksort($array, SORT_LOCALE_STRING),它也可以工作,但只能在Linux环境下。 - Tim
@PhilippMaurer sort($index_array, SORT_LOCALE_STRING); 没有起作用:-https://eval.in/990875 - Alive to die - Anant
@Tim 很高兴能帮助你 :):) - Alive to die - Anant

4

使用strcoll()函数。

setlocale(LC_ALL, 'sl_SI.utf8');
// setlocale(LC_ALL,"cs_CZ.UTF-8"); //for Czech characters etc.
uksort($a, 'strcoll');

您可以使用 usort 按值对多维数组进行排序:

 setlocale(LC_ALL, 'sl_SI.utf8');
 // setlocale(LC_ALL,"cs_CZ.UTF-8"); //for Czech characters etc.
 usort($posts, function($a, $b) {
    return strcoll($a["post_title"], $b["post_title"]);
 });

或针对对象:
 setlocale(LC_ALL, 'sl_SI.utf8');
 // setlocale(LC_ALL,"cs_CZ.UTF-8"); //for Czech characters etc.
 usort($posts, function($a, $b) {
    return strcoll($a->post_title, $b->post_title);
 });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接