以交替方式对平面数组元素进行排序,以便最后定位的元素成为新的中间元素

问题描述 投票:0回答:2

我一直在努力解决这个问题,但我似乎找不到一个好的方法来做到这一点,所以基本上我想要实现的是以数字排序的方式对数组进行排序,例如像这样:

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
php arrays sorting custom-sort
2个回答
0
投票

计算数组中的值。

$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));

0
投票

要以交替方式向内按索引数组的原始顺序(初始键)对索引数组进行排序,请循环输入数组的键并填充一个新的排序数组,其中偶数键保持不变,但从 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)
);
© www.soinside.com 2019 - 2024. All rights reserved.