6

PHPで配列をキーでソートしたいのですが、使用しているアルファベットは通常の英語のアルファベットではなく、自作のアルファベットです。これは可能ですか?

私のアルファベットは:

$alphabet = "AjawbpfmnrhHxXsSqkgtTdD =";

配列は次のようになります。

Array (
   [=k_0] => Array(
       [0] => DI.3,2 &dwA-nTr& @Hrw@
       [1] => mA
       [2] => =k
       [3] => Sfj,t
       [4] => =k
       [5] => pXr
       )
   [aA_2] => Array(
       [0] => DI.7,4 &dwA-nTr& @Hrw-smA-tA,wj@
       [1] => snD
       [2] => aA
       [3] => Sfj,t
       [4] => jt
       [5] => jt,w
       )
  [sqA_1] => Array(
       [0] => DI.6,18 &dwA-nTr& @nswt@
       [1] => ra
       [2] => sqA
       [3] => Sfj,t
       [4] => =s
       [5] => r
       )
   );

したがって、この配列をアルファベットに従って並べ替えると、キーを持つ配列[=k_0]が最後にあるはずです。

4

6 に答える 6

0

あなたの を与え、コメントごとに< <など$alphabet = "AjawbpfmnrhHxXsSqkgtTdD";を想定して、代替アルファベットの各キーを既知のアルファベットのシリーズに変換します。たとえば、次のようなマッピングを使用します。Aja

  your alphabet: AjawbpfmnrhHxXsSqkgtTdD
 'real'alphabet: abcdefghijklmnopqrstuvw

したがって、キー'Ajaw' => 'abcd'、および'fmnr' => 'ghij'などです。これにより、キーが、従来の php 関数を使用してソートできるものに変わります。ただし、元のアルファベットには存在しない文字を処理する方法が必要です。

そのようなものがうまくいくかもしれません-2つの変換関数(アルファベットから「実際の」アルファベットへ、およびその逆)が必要であり、次に、たとえばuksort.

私の 2 セント - 元の質問を明確にしていただきありがとうございます。

于 2011-06-14T22:50:05.537 に答える
0

@mickmackusa からのフィードバックの後、例を更新して uksrot で動作し、質問に完全に答えるようにしました

$order = str_split("AjawbpfmnrhHxXsSqkgtTdD");

uksort($arr, function ($a, $b) use ($order) {
    $posA = array_search($a, $order);
    $posB = array_search($b, $order);
    return $posA - $posB;
});

http://sandbox.onlinephpfunctions.com/code/9b6f39b30dcc932517bbe82608dd8a0c8d35b3da

-- usort による元の応答 --

次のようなカスタム順序配列で usort() を使用できます

$arr = array("w","b","m","n","x","x","z","T","T","A","A");

$order = array("A","j","a","w","b","p","f","m","n","r","h","H","x","X","s","S","q","k","g","t","T","d","D"," ","=");
    usort($arr, function ($a, $b) use ($order) {
        $posA = array_search($a, $order);
        $posB = array_search($b, $order);
        return $posA - $posB;
    });

(おそらく $order 文字列を分解するだけでよいので、より便利です)

私は実際にこの答えに出くわしました。これはそれをよりよく説明し、値が順序配列内にない場合に処理します。

そして実際の例http://sandbox.onlinephpfunctions.com/code/3934aafe93377ec18549d326d6551608436242a7

于 2018-07-03T10:55:02.577 に答える
-3

このコードを参照してください:

<?php

$arr = array('wr' => 1, 'wrS' => 6, 'wr,w' => 3, 'wr.w' => 4, 'wr-qA' => 2, 'wrs' => 5);

function compare_by_alphabet(array $alphabet, $str1, $str2)
{
    $l1 = strlen($str1);
    $l2 = strlen($str2);
    $c = min($l1, $l2);

    for ($i = 0; $i < $c; $i++)
    {
        $s1 = $str1[$i];
        $s2 = $str2[$i];
        if ($s1===$s2) continue;
        $i1 = array_search($s1, $alphabet);
        if ($i1===false) continue;
        $i2 = array_search($s2, $alphabet);
        if ($i2===false) continue;
        if ($i2===$i1) continue;
        if ($i1 < $i2) return -1;
        else return 1;
    }
    if ($l1 < $l2) return -1;
    elseif ($l1 > $l2) return 1;
    return 0;
}

function compare_keys_by_alphabet($a, $b)
{
    static $alphabet = array('-', ',', '.', 'A', 'j', 'a', 'w', 'b', 'p', 'f', 'm', 'n', 'r', 'h', 'H', 'x', 'X', 's', 'S', 'q', '‌​k', 'g', 't', 'T', 'd', 'D', '=', '/', '(', ')', '[', ']', '<', '>', '{', '}', '\'', '*', '#', 'I', 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, '&', '@');
    return compare_by_alphabet($alphabet, $a, $b);
}

uksort($arr, 'compare_keys_by_alphabet');

print_r($arr);

結果:

Array
(
    [wr] => 1
    [wr-qA] => 2
    [wr,w] => 3
    [wr.w] => 4
    [wrs] => 5
    [wrS] => 6
)
于 2011-06-14T22:13:15.767 に答える