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