使用usort对给定序列上的数组进行排序?

时间:2012-08-10 11:04:50

标签: php arrays usort

那么, 有许多帖子和问题使用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' Ke'来自Ka'

之前

我再次知道substr($a,0,1)只取第一个字符,这就是为什么它不起作用。 我也怀疑我必须采取另一种方法来完成工作,但我无法弄明白。

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

2 个答案:

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

答案 1 :(得分: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");