PHP 不用笨办法,怎么把一个数字的键重新排序呢?

//一个数组:
$arr= array( 'name'=>'...' ,'time'=>'...' , 'date' = '....'  );

//把他弄成:
$arr= array( 'date' = '....'  ,'time'=>'...' , 'name'=>'...'  );

怎么操作方便快捷呢?系统自带这种函数了吗?
还是得我新弄个数组按照我想要的键顺序赋值 这个笨办法呢?

阅读 1.7k
3 个回答
krsort($arr); // 降序
ksort($arr); // 升序

题主对题目的表述有些歧义,不知道你的排序要求是下面哪两种情况,索性都说一下。

1. 根据自定义规则排序

// 定义自定义规则,并赋予优先级
function cmp($a, $b){
    $arr = [$a, $b];
    foreach ($arr as &$value) {
        switch ($value) {
            case 'date':
                $value = 4;
                break;
            case 'time':
                $value = 2;
                break;
            case 'name':
                $value = 3;
                break;
            case 'title':
                $value = 1;
                break;
            default:
                # code...
                break;
        }
    }

    return $arr[0] > $arr[1];
}

$arr = [
    'name' => 'asdf',
    'time' => 'fdfsd',
    'date' => 'swere',
    'title' => 'zdsfd'
];

uksort($arr, "cmp");

var_dump($arr);

结果

array(4) {
  ["title"]=>
  string(5) "zdsfd"
  ["time"]=>
  string(5) "fdfsd"
  ["name"]=>
  string(4) "asdf"
  ["date"]=>
  string(5) "swere"
}

2. 根据将原数组键值反转排序

$arr = [
    'name' => 'asdf',
    'time' => 'fdfsd',
    'date' => 'swere',
    'title' => 'zdsfd'
];
// 键值交换后的数组
$arrToFlip = array_flip($arr);
var_dump($arrToFlip);

// 根据值反转
$arrToFlipRev = array_reverse($arrToFlip, true);
var_dump($arrToFlipRev);

// 再次键值交换
$arrRes = array_flip($arrToFlipRev);
var_dump($arrRes);

结果

array(4) {          
  ["asdf"]=>        
  string(4) "name"  
  ["fdfsd"]=>       
  string(4) "time"  
  ["swere"]=>       
  string(4) "date"  
  ["zdsfd"]=>       
  string(5) "title" 
}                   
array(4) {          
  ["zdsfd"]=>       
  string(5) "title" 
  ["swere"]=>       
  string(4) "date"  
  ["fdfsd"]=>       
  string(4) "time"  
  ["asdf"]=>        
  string(4) "name"  
}                   
array(4) {          
  ["title"]=>       
  string(5) "zdsfd" 
  ["date"]=>        
  string(5) "swere" 
  ["time"]=>        
  string(5) "fdfsd" 
  ["name"]=>        
  string(4) "asdf"  
}                   

另外说一句,以上代码不敢保证性能。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏