在数组中推进索引键

4

我有一个数组,带有数字递增的键,从0开始,像0 1 2 3 4 5....等等。我需要按照以下方式为数组分配新的键:

  • 前三个键保持其索引号

  • 每第四个键增加4

  • 第四个键后的两个键再次增加1

我知道我需要使用foreach循环(似乎是最简单的方法)构建一个具有新分配键的新数组。我的问题是键的计算。

这是我看到的相关信息

这是我的当前数组键:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

这就是我需要它们的方式:

0 1 2 6 7 8 12 13 14 18 19 20 24 25 26 30

让我们将其分解成3个键组,旧数组键在顶部,新数组键在底部

第一组

0 1 2

0 1 2

第二组

3 4 5

6 7 8

第三组

6 7 8

12 13 14

第四组

9 10 11

18 19 20

等等......

当您查看两个数组键之间的关系时,您会看到以下内容:

  • 旧的数组键 012 保留它们的键值

  • 旧的数组键 369 等,如果乘以 2,就可以得到新的数组键值

  • 旧数组键 4710 等,如果乘以 2,然后从总和中减去 1,则可以得到该特定键的新数组键

  • 旧数组键 5811 等,如果乘以 2,然后从总和中减去 2,则可以得到该特定键的新数组键

或者,如果你从新键中减去旧键,你会得到以下答案

  • 第一组为 0

  • 第二组为 3

  • 第三组为 6

  • 第四组为 9

  • 以此类推.....

可能的解决方案

我所能想到的唯一解决方案是在我的 foreach 循环中使用模运算符,检查当前键是否与模结果匹配,然后计算我的新键。

示例:

if ( $key%3 == 0 && $key != 0 ) {
    $new_key = $key * 2;
} elseif ( ( $key - 1 ) %3 == 0 && $key != 1 ) {
    $new_key = ( $key * 2 ) - 1;
} elseif ( ( $key - 2 ) %3 == 0 && $key != 2 ) {
    $new_key = ( $key * 2 ) - 2;
} else {
    $new_key = $key;
}

$new_array[$new_key] = $value;

我的问题

这个问题是否有更聪明、更数学化的解决方法呢?


2
投票将此问题标记为不明确的人,你到底不明白这个问题的什么地方? - Pieter Goosen
只是出于好奇,你为什么需要这种行为? - GordonM
这实际上更与WordPress相关,我需要运行一个循环,并将每篇文章分成两个部分,第一部分将保存前3篇文章的文章信息,之后下一部分将保存这三篇文章的第二部分,之后下面的三篇文章将按照先前的布局显示。希望这样说得清楚 :-) @GordonM - Pieter Goosen
3个回答

5
尝试以下操作:
$new_key = floor($old_key / 3) * 3 + $old_key

1
啊,糟糕了,我本来有这个想法,完全忘记使用 floor 函数来得到计算结果的最小整数。感谢你的回答。 - Pieter Goosen

1
如果您使用模数,可以生成一个带有缺失项的序列。以下代码演示了如何实现。
for ($x = 0; $x < 40; $x++) 
{
    echo ("$x, " . ($x % 6) . ", " . ($x % 6 < 3? "true": "false") . "\n");
}

输出结果为:

0, 0, true
1, 1, true
2, 2, true
3, 3, false
4, 4, false
5, 5, false
6, 0, true
7, 1, true
8, 2, true
9, 3, false
10, 4, false
11, 5, false
12, 0, true
13, 1, true
14, 2, true
15, 3, false
16, 4, false
17, 5, false
18, 0, true
19, 1, true
20, 2, true
21, 3, false
22, 4, false
23, 5, false
24, 0, true
25, 1, true
26, 2, true
27, 3, false
28, 4, false
29, 5, false
30, 0, true
31, 1, true
32, 2, true
33, 3, false
34, 4, false
35, 5, false
36, 0, true
37, 1, true
38, 2, true
39, 3, false

如果您只在 $x % 6 < 3 时使用 $x 作为键,那么您可以得到所需的序列。

1
$array = range(1,15);

For ($i=0; $i<count($array); $i++) echo $keys[] = $i + floor($i/3)*3;
$new_array = array_combine($keys, $array);
var_dump($new_array);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接