Я собираюсь немного изменить ваши 2-й, 3-й и 4-й подмассивы, чтобы лучше продемонстрировать поведение.
Опираясь на одну из техник в моем ответе на ваш предыдущий вопрос, я фактически просто упаковываю код logi c в дополнительном l oop array_map()
.
array_diff()
используется для мгновенного уничтожения любых значений во входном массиве, которые соответствуют значениям удаления. Затем array_reduce()
используется для оставшихся значений входного массива для итерации и уменьшения целых чисел, любые сгенерированные устраняют пробелы.
Внутри array_reduce()
вы увидите $value > $item
. Это сравнение вернет true
или false
. Когда в качестве числа используется логическое значение, true
становится 1
, а false
становится 0
. По сути, я вычитаю 0
или 1
из $value
в зависимости от того, как каждое значение $deletes
сравнивается с заданным $value
.
В качестве конкретного примера c при обработке 10
, 10
больше, чем 3
, поэтому оно становится 9
, а 10
больше 5
, поэтому 9
становится 8
.
Все это делается без требуется предварительно отсортировать данные.
Код: ( Демо )
$arrays = [[0, 3, 10, 5, 6, 9, 2, 7, 1, 4, 8, 11], [0, 1, 2, 3], [0, 5, 2, 4, 3, 1], [0, 1, 3, 2]];
$deletes = [3, 5];
var_export(
array_map(
function($array) use ($deletes) {
$result = [];
foreach (array_diff($array, $deletes) as $value) {
$result[] = array_reduce(
$deletes,
function ($carry, $item) use ($value) {
return $carry - ($value > $item);
},
$value
);
}
return $result;
},
$arrays
)
);
Вот альтернатива, которая ведет себя так же, но не зависит от функционального программирования так много: ( Демо )
foreach ($arrays as $index => $array) {
$filtered = array_diff($array, $deletes); // destroy blacked values
foreach ($filtered as $value) {
$originalValue = $value;
foreach ($deletes as $delete) {
$value -= $originalValue > $delete; // reduce to eliminate gaps
}
$result[$index][] = $value;
}
}
var_export($result);
Вывод (для любого фрагмента):
array (
0 =>
array (
0 => 0,
1 => 8,
2 => 4,
3 => 7,
4 => 2,
5 => 5,
6 => 1,
7 => 3,
8 => 6,
9 => 9,
),
1 =>
array (
0 => 0,
1 => 1,
2 => 2,
),
2 =>
array (
0 => 0,
1 => 2,
2 => 3,
3 => 1,
),
3 =>
array (
0 => 0,
1 => 1,
2 => 2,
),
)