Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按值按特定顺序对数组进行排序?_Php_Arrays - Fatal编程技术网

Php 如何按值按特定顺序对数组进行排序?

Php 如何按值按特定顺序对数组进行排序?,php,arrays,Php,Arrays,给定一个任意大小(从1到4轮)的数组,其秩数从1到8(或更多),我如何将该数组按括号样式排序,使秩1为第一,秩2为最后,然后秩8为下一个,然后秩7为倒数第二个。。。像 然后下一轮 1,4,3,2 我正在尝试排序比赛括号,但在排序排名时运气不太好,而且排序方式也很好,因此显示不会中断 编辑: 需要澄清的是,每个支架尺寸都需要分解如下: 如果括号中有8个游戏,则游戏编号为1到8,因此回合需要按如下方式排列: 游戏1 第八场 第五场 第四场 第六场 第三场 第七场 游戏2 那么,在下一轮,它有4场

给定一个任意大小(从1到4轮)的数组,其秩数从1到8(或更多),我如何将该数组按括号样式排序,使秩1为第一,秩2为最后,然后秩8为下一个,然后秩7为倒数第二个。。。像

然后下一轮

1,4,3,2

我正在尝试排序比赛括号,但在排序排名时运气不太好,而且排序方式也很好,因此显示不会中断

编辑

需要澄清的是,每个支架尺寸都需要分解如下:

如果括号中有8个游戏,则游戏编号为1到8,因此回合需要按如下方式排列:

  • 游戏1
  • 第八场
  • 第五场
  • 第四场
  • 第六场
  • 第三场
  • 第七场
  • 游戏2
那么,在下一轮,它有4场比赛,结果是:

  • 游戏1
  • 第四场
  • 第三场
  • 游戏2
等等:

  • 游戏1
  • 游戏2
最后,

  • 游戏1

如果首发阵容有16场比赛,而不是8场、32场或更多,那么它也需要发挥作用。我们的想法是,第1场和第8场的赢家在下一轮的第1场比赛中互相比赛。第一场和第二场比赛总是第一场和最后一场。然后它向内运行。

这不是对列表进行排序。除非您真的需要对列表进行排序,否则索引可能会更快、更有效

匹配将设置为
(当前排名),(总排名)-(当前排名)+1

因为有8个等级

1, 8 -1 +1 = 8
2, 8 -2 +1 = 7
3, 8 -3 +1 = 6
4, 8 -4 +1 = 5
所以代码看起来像


在每一轮之后,使用新的排序列表重新设置函数的种子,您将得到1vs4。2vs3.


我不是PHP专业人士,但希望这能有所帮助。

以下函数将
['r1','r2','r3','r4','r5','r6','r7','r8']
数组排序为
['r1','r8','r2','r7','r3','r6','r4','r5']
['r1',r2',r3',r4']
的数组将重新排列为
['r1',r4',r2',r3']

function rearranged($array) {
    sort($array);
    $result = array();
    $length = count($array);
    $offset = 0;
    // Handling two elements at once, therefore just do $lenght/2 iterations
    for ($i = 0; $i < $length/2; $i++) {
        // $i + $offset: The current element in the original array 
        // + the offset of fields already filled in the results array
        $result[$i + $offset] = $array[$i];
        // $i + 1 + $offset: The next element in the results array
        $result[$i + 1 + $offset] = $array[$length - $i -1];
            // Increment offset
        $offset++;
    }
    return $result;
}
重新排列的函数($array){
排序($数组);
$result=array();
$length=计数($array);
$offset=0;
//同时处理两个元素,因此只需执行$lenght/2次迭代即可
对于($i=0;$i<$length/2;$i++){
//$i+$offset:原始数组中的当前元素
//+结果数组中已填充字段的偏移量
$result[$i+$offset]=$array[$i];
//$i+1+$offset:结果数组中的下一个元素
$result[$i+1+$offset]=$array[$length-$i-1];
//增量偏移
$offset++;
}
返回$result;
}
我没有使用任何内置的
sort
函数,因为它们会将所有键相互比较,假设您的数组已经就绪,只是迭代和交换位置应该快得多。如果键未排序,则可以调用内置的
排序
函数,例如
排序
(按值排序)或
排序
(按键排序)


还要注意的是,此函数仅适用于元素数量为偶数的
数组。如果元素数量不均匀,最后一个元素将从结果数组中删除。

usort可以帮助您:这就是我要走的路,但我不知道如何对它们进行排序。如果$a是1,$b是2,你会怎么做?你应该在发布后立即检查你的帖子,你现在发布的顺序与你昨天晚上发布的顺序不同,因此目前给出的答案是无用的和错误的。这有点接近,但对于一轮8场比赛,它需要按照以下顺序进行:第1场、第8场、第5场、第4场,第六场,第三场,第七场,第二场。那么,下一个4轮的括号将是:第1场,第4场,第3场,第2场。@Kevin:你给出的例子与你在这里解释的不同。您现在需要什么订单?更新了原始问题。很抱歉
function rearranged($array) {
    sort($array);
    $result = array();
    $length = count($array);
    $offset = 0;
    // Handling two elements at once, therefore just do $lenght/2 iterations
    for ($i = 0; $i < $length/2; $i++) {
        // $i + $offset: The current element in the original array 
        // + the offset of fields already filled in the results array
        $result[$i + $offset] = $array[$i];
        // $i + 1 + $offset: The next element in the results array
        $result[$i + 1 + $offset] = $array[$length - $i -1];
            // Increment offset
        $offset++;
    }
    return $result;
}