如何通过自定义字母对php中的数组进行排序?

时间:2011-06-14 21:44:57

标签: php arrays sorting

我想在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]的数组应该在最后。

6 个答案:

答案 0 :(得分:7)

您可以使用usort()功能并提供自己的排序逻辑。

有关示例,请参阅php.net

修改:使用uksort,而不是usort。见http://www.php.net/manual/en/function.uksort.php。谢谢@Darien!

来自php.net的略微修改的示例 - 添加了$alphabet映射的原始代码:

function cmp($a, $b)
{
    // custom sort order - just swapps 2 and 3.
    $alphabet = array (1 => 1, 2 => 3, 3 => 2, 4 => 4, 5 => 5, 6=> 6);

    if ($alphabet[$a] == $alphabet[$b]) {
        return 0;
    }
    return ($alphabet[$a] < $alphabet[$b]) ? -1 : 1;
}

$a = array(3 => 'c' , 2 => 'b', 5 => 'e', 6 => 'f', 1=>'a');
uksort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}

答案 1 :(得分:1)

您可以将usort()与这样的自定义订单数组一起使用

$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字符串,这样会更好)

我实际上刚遇到this答案,它可以更好地解释它,并处理值是否不在order数组内。

答案 2 :(得分:0)

根据您的$alphabet = "AjawbpfmnrhHxXsSqkgtTdD";,并根据您的评论假设A&lt; j&lt; a等,将替代字母表中的每个键转换为系列在已知的字母表中,例如使用如下映射:

  your alphabet: AjawbpfmnrhHxXsSqkgtTdD
 'real'alphabet: abcdefghijklmnopqrstuvw

所以键'Ajaw' => 'abcd''fmnr' => 'ghij'等等。然后将你的键变成你可以使用传统的php函数排序的东西。你需要一些方法来处理原始字母表中没有的字符。

这样的东西可能会起作用 - 你需要两个变换函数(从你的字母表到'真实'字母表,反之亦然),然后是比较器,例如: uksort

我的两分钱 - 谢谢你澄清原来的问题。

答案 3 :(得分:0)

幸运的是,您的自定义字母表没有比单字节拉丁字母列表更多的字符,因此翻译是一个非常简单易读的过程。

我建议您在开始排序之前设置一个翻译数组,然后为了排序的目的对键进行翻译/规范化。

代码:(Demo)

$array = [
    '=k_0' => ['test1'],
    'aA_2' => ['test2'],
    'sqA_1' => ['test3'],
    '=kj_0' => ['test4'],
    'awA_2' => ['test5'],
    '= D_1' => ['test6'],
    'sq A_1' => ['test7'],
    'sqA_2' => ['test8'],
];

$trans = ['AjawbpfmnrhHxXsSqkgtTdD =', 'abcdefghijklmnopqrstuvwxy'];

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

输出:

array (
  'aA_2' => 
  array (
    0 => 'test2',
  ),
  'awA_2' => 
  array (
    0 => 'test5',
  ),
  'sqA_1' => 
  array (
    0 => 'test3',
  ),
  'sqA_2' => 
  array (
    0 => 'test8',
  ),
  'sq A_1' => 
  array (
    0 => 'test7',
  ),
  '=k_0' => 
  array (
    0 => 'test1',
  ),
  '=kj_0' => 
  array (
    0 => 'test4',
  ),
  '= D_1' => 
  array (
    0 => 'test6',
  ),
)

从 PHP7.4 开始,可以使用箭头函数语法减少语法。

uksort(
    $array,
    fn($a, $b) => strtr($a, ...$trans) <=> strtr($b, ...$trans)
);

答案 4 :(得分:-1)

<?php
$arr = [8,10,12,18,20,7,4,6,2,20,0]; //take array

 $a= sortasc($arr); // call function

function sortasc($arr){


    for($i=0;$i<=count($arr);$i++){
            for($j=1;$j<=count($arr)-1;$j++){

                         if($arr[$j-1]>$arr[$j]){

                        $temp = $arr[$j];
                        $arr[$j]= $arr[$j-1];
                        $arr[$j-1] = $temp;
                    }
        }
    }
        return $arr;
}

?>

答案 5 :(得分:-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
)