8

strnatcmpテーブル内の人名を並べ替えるために、比較関数で使用しています。ベルギーのクライアントの場合、奇妙な結果が得られます。彼らは「ヴァン デル ブロッケ」や「ヴァンダー ヴィーレ」などの名前を持ち、strnatcasecmp("Van der", "Vander")戻ってきます0

自然な比較は人間が行うようにソートすることを目的としているため、スペースが完全に無視される理由がわかりません。

例えば:

$names = array("Van de broecke", "Vander Veere", "Vande Muizen", "Vander Zoeker", "Van der Programma", "vande Huizen", "vande Kluizen", "vander Muizen", "Van der Luizen");
natcasesort($names);

print_r($names);

与えます:

Array ( 
[0] => Van de broecke 
[5] => vande Huizen 
[6] => vande Kluizen 
[2] => Vande Muizen 
[8] => Van der Luizen 
[7] => vander Muizen 
[4] => Van der Programma 
[1] => Vander Veere 
[3] => Vander Zoeker 
)

しかし、人間は次のように言うでしょう。

Array ( 
[0] => Van de broecke 
[4] => Van der Programma 
[8] => Van der Luizen 
[5] => vande Huizen 
[6] => vande Kluizen 
[2] => Vande Muizen 
[7] => vander Muizen 
[1] => Vander Veere 
[3] => Vander Zoeker 
)

私の解決策は、適切に処理されるすべてのスペースをアンダースコアに置き換えることです。2 つの質問: なぜnatsortこのように機能するのですか? より良い解決策はありますか?

4

3 に答える 3

2

他の回答/コメンターが言ったように、これは既知の問題です。ただし、usort() を使用して独自の並べ替えを作成できます。これを試して、動作するかどうかを確認してください:

usort($names2, function($first, $second) {
    if ($first == $second) {
        return 0;
    }
    else {
        return (strtolower($first) < strtolower($second)) ? -1 : 1;
}
});

出力が提案された回答とは少し異なることに気付きました:

あなたは提案しました:

[4] => Van der Programma 
[8] => Van der Luizen

しかし、これはタイプミスだと確信しています。これらは交換する必要があります。:)

于 2013-08-23T19:32:10.887 に答える
2

bugs.php.net #26412 を見てください (natsort() は複数のスペースを 1 つのスペースに圧縮していました)。どうやら、この動作は "aa"、"a a"、および "a a" (2 つのスペースに注意してください) が同一の文字列としてソートされないようにするためです。

于 2013-08-21T17:15:27.923 に答える