dqzve68846 2013-03-02 20:54
浏览 8
已采纳

PHP排序/排序一维数组键或任何排序顺序

Consider following list:

$list = array(
        0 => A, 
        1 => X, 
        2 => B, 
        3 => Z, 
        4 => K, 
        5 => M
        );

I want to change position of A from 0 to 2 then the $list became:

$list = array(
        0 => X, 
        1 => B, 
        2 => A, 
        3 => Z, 
        4 => K, 
        5 => M
        );

The following code is what I have tried so far, is there another way using array functions? or any shorter way?

<?php
  $list = array(0 => 'A', 1 => 'X', 2 => 'B', 3 => 'Z', 4 => 'K', 5 => 'M');
  function change_position($oldposition, $newposition, $list){
    echo "Changing $oldposition to $newposition :
";
    foreach($list as $k => $v){
         if($oldposition < $newposition){
            if( $k < $oldposition ){
              $newlist[$k] = $list[$k];
            }
            if($k >= $oldposition && $k < $newposition){
              $newlist[$k] = $list[$k+1];
            }
            if($k == $newposition){
             $newlist[$k] = $list[$oldposition];
            }
            if($k > $newposition){
             $newlist[$k] = $list[$k];
            }
         }
         if($oldposition > $newposition){
            if( $k > $oldposition ){
              $newlist[$k] = $list[$k];
            }
            if($k <= $oldposition && $k > $newposition){
              $newlist[$k] = $list[$k-1];
            }
            if($k == $newposition){
             $newlist[$k] = $list[$oldposition];
            }
            if($k < $newposition){
             $newlist[$k] = $list[$k];
            }
         }
   }
   return $newlist;
}
echo '<pre>';
print_r($list);
print_r(change_position(5, 0, $list));
print_r(change_position(0, 5, $list));
?> 

Output:

Array
(
    [0] => A
    [1] => X
    [2] => B
    [3] => Z
    [4] => K
    [5] => M
)
Changing 5 to 0 :
Array
(
    [0] => M
    [1] => A
    [2] => X
    [3] => B
    [4] => Z
    [5] => K
)
Changing 0 to 5 :
Array
(
    [0] => X
    [1] => B
    [2] => Z
    [3] => K
    [4] => M
    [5] => A
)
  • 写回答

1条回答 默认 最新

  • duandiaoqian5795 2013-03-02 20:56
    关注

    Just use array_splice:

    function move_element(&$array, $element, $position)
    {
        $key = array_search($element, $array, true);
        if ($key === false) {
            return;
        }
    
        array_splice($array, array_search($key, array_keys($array)), 1);
        array_splice($array, $position, 0, $element);
    }
    

    Your example would be achieved with

    move_element($list, 'A', 2);
    

    If you don't want to specify the target as a value but as a position it's even easier:

    function move_element(&$array, $from, $to)
    {
        $removed = array_splice($array, $from, 1);
        array_splice($array, $to, 0, $removed);
    }
    
    move_element($list, 0, 2);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分