0

Pythonでは、完全にうまく機能する次のものがあります。

list = [('wr', ['A1']), ('wr-qA', ['A3']), ('wr,w', ['A4']), ('wr-mw', ['A2']), ('wrs', ['A6']), ('wrD', ['A8']), ('wrS', ['A7']), ('wr.w', ['A5']), ('=k', ['A10']), ('Dd', ['A9'])]

alphabet = " -,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@"

Sorted_list = sorted(list, key=lambda (v, k): [alphabet.index(c) for c in v])
print Sorted_list

出力:

[('wr', ['A1']), ('wr-mw', ['A2']), ('wr-qA', ['A3']), ('wr,w', ['A4']), ('wr.w', ['A5']), ('wrs', ['A6']), ('wrS', ['A7']), ('wrD', ['A8']), ('Dd', ['A9']), ('=k', ['A10'])]

PHPで同じことを行うにはどうすればよいですか:

$list = array(
    'wr' => 'A1',
    'wr-qA' => 'A3',
    'wr,w' => 'A4',
    'wr-mw' => 'A2',
    'wrs' => 'A6',
    'wrD' => 'A8',
    'wrS' => 'A7',
    'wr.w' => 'A5',
    '=k' => 'A10',
    'Dd' => 'A9'
);
4

4 に答える 4

4

私はあなたの質問を完全には理解していませんが、PHPでカスタムソートを行う必要がある場合は、usortまたはを使用する必要がありますuasort。配列にカスタムキーがあるので、おそらく2番目のものです。

幸運にもPHP5.3を使用できる場合は、コールバックをクロージャーとして提供できます。

これは、PHPではユーザーの並べ替えと同等です。indexOfPHPでの同等物はstrposです。

警告:の戻り値を比較するときは注意してください。一致するものが見つからない場合にstrpos返される可能性があるためです。falseそしてPHPでは( )は。にfalse等しい。==0


PHPでのリスト構造について。多分あなたはこのようなものが必要です。

$list = array(array('wr', array('A1')), array('wr-qA',array('A3')), ...);

でもわからない。

于 2011-06-16T09:49:25.717 に答える
1

ラムダソートの場合、usort(...)(およびstrcmp()比較のために)使用できます

usort($list, "strcmp"); // PHP function name as a string

PHP 5.3 以降、無名関数をコールバック パラメータとして使用することもできます。

usort($list, function($a, $b) { return strcmp($a, $b) }); 
// Note - callback function must return integer comparison between 2 elements

ただし、値で並べ替える場合は、単に使用するsort()か、キーで並べ替える場合は使用できますksort()(それらは所定の場所で並べ替えられ、ブール値のフラグのみが返されることに注意してください)。

于 2011-06-16T09:50:26.033 に答える
0

これが私が思いついたものです。を使用しますuksort()。これは、ユーザー定義の並べ替え関数を取り、キーに基づいて要素を並べ替えます (これが必要なようです)。

コードを少し調整する必要があるかもしれませんが、試してみたところうまくいきました。を呼び出した後uksort()$list変数にはソートされた配列が含まれます。

このコード例では、PHP 5.3 から利用できる匿名関数を並べ替え関数として使用しましたが、それ以前は単純な関数を使用できます (例については、uksort()以前にリンクした参照を確認できます)。

$list = array('wr' => 'A1', 'wr-qA' => 'A3', 'wr,w' => 'A4', 'wr-mw' => 'A2', 'wrs' => 'A6', 'wrD' => 'A8', 'wrS' => 'A7', 'wr.w' => 'A5', '=k' => 'A10', 'Dd' => 'A9');
$alphabet = " -,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@";

uksort($list, function ($a, $b) use ($alphabet) {
    $shorter=min($a, $b);
    $len=strlen($shorter);
    for ($i=0, $len=strlen($shorter); $i < $len; $i++) {
        $aval=strpos($alphabet, $a[$i]);
        $bval=strpos($alphabet, $b[$i]);
        if ($aval!=$bval) {
            return $aval > $bval ? 1 : -1;
        }
    }
    return $shorter==$b ? 1 : -1;
});

編集:匿名関数のないバージョンをすぐに書きました:

$list = array('wr' => 'A1', 'wr-qA' => 'A3', 'wr,w' => 'A4', 'wr-mw' => 'A2', 'wrs' => 'A6', 'wrD' => 'A8', 'wrS' => 'A7', 'wr.w' => 'A5', '=k' => 'A10', 'Dd' => 'A9');

function alphabet_sorter($a, $b) {
    $alphabet = " -,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@";

    $shorter=min($a, $b);
    $len=strlen($shorter);
    for ($i=0, $len=strlen($shorter); $i < $len; $i++) {
        $aval=strpos($alphabet, $a[$i]);
        $bval=strpos($alphabet, $b[$i]);
        if ($aval!=$bval) {
            return $aval > $bval ? 1 : -1;
        }
    }
    return $shorter==$b ? 1 : -1;
}

uksort($list, 'alphabet_sorter');
于 2011-06-16T10:05:18.507 に答える
0

以前の質問に対する私の回答とまったく同じuksort()関数を使用して、翻訳文字列を拡張して、カスタム アルファベットのスペース以外の文字に大文字と小文字を使用するだけです。どちらも最初の位置にあり、翻訳は無意味であるため、両方の翻訳文字列からスペースを削除しました.

コード: (デモ)

$trans = [
    "-,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@",
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
];

$list = [
    'wr' => 'A1',
    'wr-qA' => 'A3',
    'wr,w' => 'A4',
    'wr-mw' => 'A2',
    'wrs' => 'A6',
    'wrD' => 'A8',
    'wrS' => 'A7',
    'wr.w' => 'A5',
    '=k' => 'A10',
    'Dd' => 'A9'
];

uksort(
    $list,
    function ($a, $b) use ($trans) {
        return strtr($a, ...$trans) <=> strtr($b, ...$trans);
    }
);

var_export($list);

出力:

array (
  'wr' => 'A1',
  'wr-mw' => 'A2',
  'wr-qA' => 'A3',
  'wr,w' => 'A4',
  'wr.w' => 'A5',
  'wrs' => 'A6',
  'wrS' => 'A7',
  'wrD' => 'A8',
  'Dd' => 'A9',
  '=k' => 'A10',
)
于 2021-03-05T13:53:34.510 に答える