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