Хорошего дня!
У меня есть структура массива для 13
с range (1,13)
;
это что-то вроде
array(1,2,3,4,5,6,7,8,9,10,11,12,13);
$slice=2;
$ignore = 3;
я хочу структуру массива, как array(3,4,5,8,9,10,13);
Я попытался с функцией array_slice, но я не мог сместить значение последовательно
array_slice($array,2,13,true);
есть ли способ игнорировать следующий 3
Значения и добавить срез на следующую секунду до последнего массива, любая родная функция или ключ будет отличным.
Спасибо,
Vicky
С помощью array_merge()
, функция один может объединить два среза массива. Это вернет новый массив.
http://php.net/manual/en/function.array-merge.php
<?php
$slice = 2;
$ignore = 3;
$a = array(1,2,3,4,5,6,7,8,9,10,11,12,13);
$a = array_merge(array_slice($a, $slice,$ignore),array_merge(array_slice($a, 2* $slice + $ignore,3), array_slice($a, 3* $slice + 2*$ignore)));
var_dump($a);
?>
Я надеюсь, что вы получили это. 🙂
Вот функция, которая будет рекурсивно выполнять «асимметричный» разрез массива n
длина:
function slice_asym(array $head, $exclude, $include)
{
$keep = array_slice($head, $exclude, $include);
$tail = array_slice($head, $exclude + $include);
return $tail ? array_merge($keep, slice_asym($tail, $exclude, $include))
: $keep;
}
Рекурсия требует базовый вариант где рекурсия останавливается, и все области видны. В нашем случае мы хотим остановиться, когда tail
не содержит больше элементов.
array_slice()
всегда возвращает массив — если нет элементов для возврата для данного смещения, array_slice()
возвращает пустой массив Итак, для каждой рекурсии мы хотим:
Вырежьте те элементы, которые мы хотим $keep
Создать $tail
— это подмножество массива, которое исключает элементы, которые мы оба хотим игнорировать и сохранять в текущей области видимости ($exclude + $include
).
Если $tail
не пусто, создайте новый уровень рекурсии. В противном случае остановите рекурсию и объедините все текущие $keep
элементы с результатом следующего уровня рекурсии.
В псевдокоде это выглядит примерно так:
# step 1: first recursion
head = [1,2,3,4,5,6,7,8,9,10,11,12,13]
keep = [3,4,5]
tail = [6,7,8,9,10,11,12,13] # tail not empty
# step 2: second recursion
head = [6,7,8,9,10,11,12,13]
keep = [8,9,10]
tail = [11,12,13] # tail not empty
# step 3: third recursion
head = [11,12,13]
keep = [13]
tail = [] # tail empty: base case met!
# return and merge `keep` elements
[3,4,5] + [8, 9, 10] + [13] -> [3,4,5,8,9,10,13]
Согласно вашему примеру, следующий вызов:
$range = range(1, 13); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
$sliced = slice_asym($range, 2, 3);
print_r($sliced);
Урожайность:
Array
(
[0] => 3
[1] => 4
[2] => 5
[3] => 8
[4] => 9
[5] => 10
[6] => 13
)
редактировать
Если вы используете PHP версии 5.5 или выше, это также хороший вариант использования для генератор.
Это полезно, потому что:
Генератор позволяет вам писать код, который использует foreach для итерации по набору данных без необходимости создания массива в памяти, что может привести к превышению лимита памяти или значительному времени обработки для генерации.
Таким образом, вам не нужно предварительно создавать массив последовательных значений:
Вместо этого вы можете написать функцию генератора, которая аналогична обычной функции, за исключением того, что вместо однократного возврата генератор может выдавать столько раз, сколько ему нужно, чтобы предоставить значения для повторения.
Мы могли бы реализовать генератор для вашего случая использования так:
/**
*
* @param int $limit
* @param int $exclude
* @param int $include
* @return int
*/
function xrange_asym($limit, $exclude, $include) {
if ($limit < 0 || $exclude < 0 || $include < 0) {
throw new UnexpectedValueException(
'`xrange_asym` does not accept negative values');
}
$seq = 1;
$min = $exclude;
$max = $exclude + $include;
while ($seq <= $limit) {
if ($seq > $min && $seq <= $max) {
yield $seq;
}
if ($seq === $max) {
$min = $exclude + $max;
$max = $exclude + $include + $max;
}
$seq = $seq + 1;
}
}
и использовать его, вот так:
foreach (xrange_asym(13, 2, 3) as $number) {
echo $number . ', '; // 3, 4, 5, 8, 9, 10, 13
}
Или использовать iterator_to_array()
создать весь диапазон в виде массива:
print_r(iterator_to_array(xrange_asym(13, 2, 3)));
Надеюсь это поможет 🙂