推进数组

时间:2015-06-09 10:15:01

标签: php arrays foreach

我有一个数字递增键的数组,从0开始,如0 1 2 3 4 5 ....etc。我需要以下列方式为数组分配新键

  • 前三个键保留其索引号

  • 每个第4个键增加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

第3组

  

6 7 8

     

12 13 14

第4组

  

9 10 11

     

18 19 20

等等......

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

  • 旧数组键012保留其键值

  • 旧数组键369等,如果乘以2,则会为您提供新的数组键值

    < / LI>
  • 旧数组键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;

我的问题

是不是有更聪明的数学方法呢?

3 个答案:

答案 0 :(得分:5)

尝试以下方法:

$new_key = floor($old_key / 3) * 3 + $old_key

答案 1 :(得分:1)

如果你使用modulous,你可以生成一个缺少项目的序列。以下代码演示了如何执行此操作。

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时使用$x % 6 < 3作为密钥,则可以获得所需的序列。

答案 2 :(得分: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);