使用 usort 在给定顺序上对数组进行排序?

3

好的,有很多帖子和问题使用usort对自定义模式的数组进行排序,但是没有找到符合我的需求的内容。以下是我目前的代码:

$arrayToSort=array("Sabin","Anil","Cyrus","Kamal","Kesha","Bimal");

function mycmp($a, $b)
{
    static $order = array('A', 'B','C',"Ke'",'Ka','R', 'S');
    return array_search(substr($a,0,1), $order) - array_search(substr($b,0,1), $order);
}

usort($arrayToSort, "mycmp");

以上代码按以下方式对 $arrayToSort 进行排序。
Array
(
    [0] => Anil
    [1] => Bimal
    [2] => Cyrus
    [3] => Kamal
    [4] => Kesha
    [5] => Sabin
)

然而,如果您查看我的自定义模式 static $order = array('A', 'B','C',"Ke'",'Ka','R', 'S');,则Kesha应该排在Kamal之前,因为在我的模式中,“Ke”排在“Ka”之前。

再次说明,我知道substr($a,0,1)仅获取第一个字符,这就是它不起作用的原因。我也怀疑我必须采取另一种方法来完成工作,但我无法想出解决办法。

如果数组模式的元素不一致,即某些元素只有一个字符,而其他元素有两个字符,该如何排序?任何帮助都将不胜感激。谢谢

2个回答

1

这里有一种方法可以做到。虽然它肯定可以更好地优化,但你已经有了想法。

<?php

class Accessor {
  static $order = array(
    'A' => 1,
    'B' => 1,
    'C' => 1,
    'K' => array(
      'e' => 1,
      'a' => 1,
    ),
    'R' => 1,
    'S' => 1
  );
}

$arrayToSort=array("Kamal","Kesha","Sabin","Anil","Cyrus","Bimal");

function mycmp($a, $b, $base) {
  $letter1 = $a[0];
  $letter2 = $b[0];
  if ($letter1 == $letter2) {
    if (is_array($base[$letter1])) {
      return mycmp(substr($a, 1), substr($b, 1), $base[$letter1]);
    }
  }
  return array_search($letter1, array_keys($base)) - array_search($letter2, array_keys($base));
}

function cmp_proxy($a, $b) {
  return mycmp($a, $b, Accessor::$order);
}

usort($arrayToSort, "cmp_proxy");
print_r($arrayToSort);

输出

Array
(
    [0] => Anil
    [1] => Bimal
    [2] => Cyrus
    [3] => Kesha
    [4] => Kamal
    [5] => Sabin
)

谢谢,这正是我想要的。但有一件事让我想知道,为什么要使用类?如果我们在函数cmp_proxy()中使用静态变量$order而不是在类中定义它,会有什么区别呢? - WatsMyName

0

试试这个

   $arrayToSort=array("Sabin","Anil","Cyrus","Kamal","Kesha","Bimal");

    function mycmp($a, $b)
    {
        static $order = array('A', 'B','C',"Ke'",'Ka','R', 'S');
        return searchArray($a, $order) - searchArray($b, $order);
    }
    function searchArray($str,$order) {

    $i = 1;
    do {

    $result = array_search(substr($str,0,$i++),$order);
    if($result)
    return $result
    }while(i < strlen($str))
    return -1;
    }
    usort($arrayToSort, "mycmp");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接