PHP,按字母顺序对一个字母进行数组排序

时间:2020-09-27 10:19:57

标签: php

我有一个代码需要按字母顺序排序,而不是普通字母,而是指定的字母。我们可以在下面看到:

$alphabetArray = ['t','w','h','z','k','d','f','v','c','j','x','l','r','n','q','m','g','p','s','b'];

我有这个带有这些字母的数组,我需要按这些字母对其他数组进行排序,在另一个数组中,我有这个:

$wordsArray = [ "jhona", "eric", "caio", "noah ];
普通字母中的

是A B C D E F G H .. 但是在本练习中,我需要像T W H Z K D F V C J X L R N Q M G P S B

任何人都可以帮助我,我尝试排序功能,但是idk怎么做。

1 个答案:

答案 0 :(得分:2)

使用Array#usort进行带有回调的用户定义排序。 注意:必须使用use才能在回调中访问$alphabetArray

说明: usort带有2个参数:首先是用于排序的数组,其次是用于比较数组中2个元素的回调函数。对于此回调,我使用了带有2个参数的匿名函数(我使用$a$b,但您可以在此处使用所需的内容)。因为我需要此功能中的$alphabetArray,并且不能为此使用第三个参数,所以我使用use来访问该函数内部的此全局变量。
为了进行比较,编译器将始终将数组中的2个值与此回调进行比较,并按返回值对它们进行排序:

  • $ a <$ b需要-1(或任何其他负值)

  • $ a = $ b需要0

  • $ a> $ b需要+1(或任何其他正值)

两个值的比较如下:

  • 如果一个值的值较小/较大(按$alphabetArray中的字母顺序),则查找第一个字符(从左开始)。
  • 如果是,则返回所需的返回值-1 / + 1。
  • 否则,继续下一个字符。
  • 如果一个字符串较短,那么另一个则停止,如果两个值相等,则返回0。
  • 否则,返回-1 / + 1,以便将较短的字符串排在另一个字符串之前。

在这里玩http://sandbox.onlinephpfunctions.com/code/06c40db2ce233494df533fc5f1842d27f94ed003

$alphabetArray = ['t','w','h','z','k','d','f','v','c','j','x','l','r','n','q','m','g','p','s','b'];
$wordsArray = [ "jhona", "eric", "caio", "noah", "noaht", "caxa", "caa" ];

usort($wordsArray, function($a,$b) use($alphabetArray) {
    $len = min(strlen($a), strlen($b));
    for ($i=0; $i<$len; $i++) {
        $aa = array_search($a[$i], $alphabetArray);
        $bb = array_search($b[$i], $alphabetArray);
        if ($aa < $bb) return -1;
        elseif ($aa > $bb) return 1;
    }
    if (strlen($a)===strlen($b)) return 0;
    else return (strlen($a) - strlen($b));
});

print_r($wordsArray);