$test = array(
 1 => '1_5000',
 2 => '1_10000',
 3 => '1_7000',
 4 => '1_6500',
 5 => '1_5500',
 6 => '1_10500',
 7 => '0_0',
 8 => '1_9000',
 9 => '1_7000',
 10 => '1_11000',
 11 => '1_5000',
 12  => '0_0',
);foreach($test as $k=>$v) {
  if($v == '0_0') $t[$k] = $v;
  else $r[] = $v;
}
usort($r, 'foo');
$i = 1;
foreach($r as $v) {
  if(isset($t[$i])) $test[$i] = $t[$i];
  else $test[$i] = $v;
  $i++;
}
var_export($test);function foo($a, $b) {
  list(, $a,, $b) = explode('_', $a . "_$b");
  if($a == $b) return 0;
  return $a > $b ? -1 : 1;
}
array (
  1 => '1_11000',
  2 => '1_10500',
  3 => '1_10000',
  4 => '1_9000',
  5 => '1_7000',
  6 => '1_7000',
  7 => '0_0',
  8 => '1_5500',
  9 => '1_5000',
  10 => '1_5000',
  11 => '1_5000',
  12 => '0_0',
)

解决方案 »

  1.   


    $test = array(
     1 => '1_5000',
     2 => '1_10000',
     3 => '1_7000',
     4 => '1_6500',
     5 => '1_5500',
     6 => '1_10500',
     7 => '0_0',
     8 => '1_9000',
     9 => '1_7000',
     10 => '1_11000',
     11 => '1_5000',
    12  => '0_0'
    );$tmp = array();
    $statickey = array();
    foreach($test as $key=>$val){
    if($val=='0_0'){
    $statickey[$key] = $val;
    }else{
    list($a,$b) = explode('_', $val);
    array_push($tmp, $b);
    }
    }rsort($tmp);for($i=1,$j=0,$len=count($test); $i<=$len; $i++){
    if(!isset($statickey[$i])){
    $result[$i] = $tmp[$j];
    $j++;
    }else{
    $result[$i] = $statickey[$i];
    }
    }print_r($result);Array
    (
        [1] => 11000
        [2] => 10500
        [3] => 10000
        [4] => 9000
        [5] => 7000
        [6] => 7000
        [7] => 0_0
        [8] => 6500
        [9] => 5500
        [10] => 5000
        [11] => 5000
        [12] => 0_0
    )
      

  2.   

    感谢老大,学习了usort。但是当我将这段代码在一个类中使用时,就会报错了
    usort() expects parameter 2 to be a valid callback, function 'foo' not found or invalid function name
    这个报错是什么意思
      

  3.   

    usort 的第二个函数是回调函数名(字符串)
    你需要确保这个函数是已定义的如果你使用类的方法作为回调函数,那么应该写作 array($this, '方法名')
    这个用法几乎没有文字资料(包括手册)做过说明,但散见于一些代码中