我一直在努力解决这个问题,但我似乎找不到一个好的方法来做到这一点,所以基本上我想要实现的是以数字排序的方式对数组进行排序,例如像这样:
Array output (unsorted)
7777777777
7777777777
6666666666
6666666666
2222222222
Array output (sorted)
7777777777
6666666666
2222222222
6666666666
7777777777
我正在考虑创建一个 NxN 数组并对其进行排序,如果有 2 个七和六的数组元素,它会对它们进行排序
7
6
6
7
所有奇数,如本例 2 所示,它将像这样排序
7
6
2
6
7
计算数组中的值。
$values = array_count_values($array);
(如果您希望将更大的偶数组排序到结果数组对称部分的内部或外部,则可以在这之后使用
asort($values);
或 arsort($values);
。或者如果您不关心,也可以不这样做。 )
根据这些计数构建偶数和奇数数组。
foreach ($values as $value => $count) {
if ($count % 2) {
while ($count--) $odds[] = $value;
} else {
$count /= 2; // half the size, so half can go at the beginning and half at the end
while ($count--) $evens[] = $value;
}
}
将偶数和奇数数组合并在一起以创建结果。
$result = array_merge($evens, $odds, array_reverse($evens));
要以交替方式向内按索引数组的原始顺序(初始键)对索引数组进行排序,请循环输入数组的键并填充一个新的排序数组,其中偶数键保持不变,但从 PHP_INT_MAX 中减去奇数键。通过这个新的排序数组对输入数组进行排序。
$array = [
'7777777777',
'7777777777',
'6666666666',
'6666666666',
'2222222222',
];
array_multisort(
array_map(fn($k) => $k & 1 ? PHP_INT_MAX - $k : $k, array_keys($array)),
$array
);
var_export($array);
或者在不调用排序函数的情况下,您可以将赔率分组为偶数和赔率,然后反转赔率的顺序,然后合并两个数组中的值。 (演示)
$grouped = [[], []];
foreach ($array as $i => $v) {
$grouped[(int) $i & 1][] = $v;
}
$grouped[1] = array_reverse($grouped[1]);
var_export(
array_merge(...$grouped)
);