Продвижение индексных ключей в массиве

У меня есть массив с числовыми приращениями ключей, начиная с 0, лайк 0 1 2 3 4 5 ....etc, Мне нужно назначить новые ключи для массива следующим образом

  • Первые три ключа сохраняют свой индекс

  • Каждый четвертый ключ увеличивается на 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 группы ключей со старым ключом массива вверху и новым ключом массива внизу

1-я группа

0 1 2

0 1 2

2 группа

3 4 5

6 7 8

3 группа

6 7 8

12 13 14

4 группа

9 10 11

18 19 20

и т. д.......

Когда вы посмотрите на связь между двумя ключами массива, вы увидите следующее:

  • Старые ключи массива 0, 1 а также 2 сохранить их значение ключа

  • Старые ключи массива 3, 6, 9 и т. д., если умножить на 2, дает вам новое значение ключа массива

  • Старые ключи массива 4, 7, 10 и т. д., если умножить на 2 и вы вычитаете 1 из этой суммы вы получаете новый ключ массива для этого конкретного ключа

  • Старые ключи массива 5, 8, 11 и т. д., если умножить на 2 и вы вычитаете 2 из общего числа вы получаете новый ключ массива для этого конкретного ключа

Кроме того, если вы вычесть старый ключ из нового ключа, вы получите следующий ответ

  • 0 для 1-й группы

  • 3 для 2-й группы

  • 6 для 3-й группы

  • 9 для 4-й группы

  • и т. д......

ВОЗМОЖНОЕ РЕШЕНИЕ

Единственное решение, которое я могу придумать, это использовать оператор модуля (внутри моего 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 ответа

Решение

Попробуйте следующее:

$new_key = floor($old_key / 3) * 3 + $old_key
$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);

Если вы используете 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 Вы можете получить последовательность, которую вы хотите.

Другие вопросы по тегам