亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用黑名單數組刪除值,然后減少剩余值以消除間隙?

如何使用黑名單數組刪除值,然后減少剩余值以消除間隙?

PHP
ABOUTYOU 2023-07-21 15:57:37
這個問題基本上是我之前問題的延伸:如何減去數組的值但仍處于位置我有一個數組的輸入數組。每個子數組中的值始終由0從無間隙開始的值組成,值遞增 1。但是,這些值不一定按順序排列,并且我需要在執行所需邏輯時保留此順序。接下來,我有一個希望從所有子數組中刪除的值黑名單。必須刪除黑名單數組中存在的任何原始子數組值。數組的示例輸入數組:$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];我想要的輸出是:[ ????[0,?8,?4,?7,?2,?5,?1,?3,?6,?9], ????[0,?1,?2], ????[0,?2,?3,?1], ????[0,?1,?2], ]自從我刪除數字以來,所有大于的剩余值都3減少了1,并且大于的值都5減少了。22如果給定子數組中的所有數字都小于黑名單數組中的所有數字,則不需要對該子數組進行任何更改。我在這里嘗試編碼https://3v4l.org/lX2MP,但在返回它們的值時我陷入困境。所有數組值都合并在一起。
查看完整描述

2 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

我將稍微改變你的第二個、第三個和第四個子數組,以更好地演示該行為。

利用我對上一個問題的回答中的一項技術,我實際上只是將代碼邏輯包裝在一個附加循環中array_map()

array_diff()用于立即銷毀輸入數組中與刪除值匹配的任何值。然后array_reduce()使用輸入數組的剩余值來迭代并減少任何生成的整數以消除間隙。

里面array_reduce(),你會看到$value > $item。此比較將返回trueor false。當布爾值用作數字時,true變為1false變為0。基本上,我根據每個值與給定的比較來減去01減去。$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,

  ),

)


查看完整回答
反對 回復 2023-07-21
?
阿波羅的戰車

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()最后對每個單獨的子數組執行一個操作。


查看完整回答
反對 回復 2023-07-21
  • 2 回答
  • 0 關注
  • 150 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號