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)只需要第一个字符,这就是它不起作用的原因。我也怀疑我必须采取另一种方法来完成工作,但我无法弄清楚。

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

4

2 回答 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
)
于 2012-08-10T11:38:00.873 回答
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");
于 2012-08-10T11:26:13.480 回答