2 回答

TA貢獻1788條經驗 獲得超4個贊
我將稍微改變你的第二個、第三個和第四個子數組,以更好地演示該行為。
利用我對上一個問題的回答中的一項技術,我實際上只是將代碼邏輯包裝在一個附加循環中array_map()
。
array_diff()
用于立即銷毀輸入數組中與刪除值匹配的任何值。然后array_reduce()
使用輸入數組的剩余值來迭代并減少任何生成的整數以消除間隙。
里面array_reduce()
,你會看到$value > $item
。此比較將返回true
or false
。當布爾值用作數字時,true
變為1
并false
變為0
。基本上,我根據每個值與給定的比較來減去0
或1
減去。$value
$deletes
$value
作為一個具體例子,當處理時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,
),
)

TA貢獻1862條經驗 獲得超6個贊
要從數組中刪除數字并從原始數組中的當前數字中減去小于該數字的計數selectedDeletedNumbers
,您可以:
對數組進行排序
selectedDeletedNumbers
。迭代原始數組并使用它
binary search
來獲取小于原始數組中當前數字的數字計數,然后將其減去。如果當前編號存在于 中
selectedDeletedNumbers
,則取消設置它們。對每個單獨的子數組應用上述操作。
片段:
<?php
function subtract(&$arr,$selectedDeletedNumbers){ // pass by reference to edit the same copy of the array
? ? foreach($arr as $index => $val){
? ? ? ? $low = 0;$high = count($selectedDeletedNumbers) - 1;
? ? ? ? $equal_found = false;
? ? ? ? while($low <= $high){
? ? ? ? ? ? $mid = intval(($low + $high) / 2);
? ? ? ? ? ? if($selectedDeletedNumbers[$mid] > $val){
? ? ? ? ? ? ? ? $high = $mid - 1;
? ? ? ? ? ? }else if($selectedDeletedNumbers[$mid] < $val){
? ? ? ? ? ? ? ? $low = $mid + 1;
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? $equal_found = true;
? ? ? ? ? ? ? ? unset($arr[$index]); // if equal value, delete it as it your need
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ??
? ? ? ? if(!$equal_found){
? ? ? ? ? ? $arr[$index] -= $low; // delete the offset till where it is greater among your $selectedDeletedNumbers
? ? ? ? }
? ? }
}
$selectedDeletedNumbers = [3,5];
sort($selectedDeletedNumbers); // sort to be apply binary search later
$arr = [[0, 3, 10, 5, 6, 9, 2, 7, 1, 4, 8, 11], [0, 1], [0, 1], [0, 1]];
foreach($arr as &$val){ // pass by reference to edit the same copy of the array
? ? subtract($val,$selectedDeletedNumbers);?
}
print_r($arr);
演示: https:?//3v4l.org/RMh5U
如果您想按順序重新索引數字,請array_values()
最后對每個單獨的子數組執行一個操作。
- 2 回答
- 0 關注
- 150 瀏覽
添加回答
舉報