【问题标题】:using usort to sort array on the given sequence?使用 usort 对给定序列的数组进行排序?
【发布时间】:2012-08-10 11:04:50
【问题描述】:

嗯, 有很多帖子和问题使用 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) 仅使用第一个字符,这就是它不起作用的原因。 我也怀疑我必须采取另一种方法来完成工作,但我无法弄清楚。

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

【问题讨论】:

    标签: php arrays usort


    【解决方案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 而不是在类中定义它会有什么区别?
    【解决方案2】:

    试试这个

       $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");
    

    【讨论】:

      最近更新 更多