PHP-深度混合索引/关联数组中的UNSET元素


PHP - UNSET Elements in a Deep Mixed Index/Associative Array

我在PHP中有一个混合索引/关联数组,理论上它可以无限深,因为有些元素可能有"子"数组。我附上一个精简的例子。php数组源自一些JSON数据。

我想搜索给定的键/值对,并删除索引级别上与该对匹配的任何元素。

例如,在下面的数组中,我希望搜索"formId"的键和值"44",并删除元素,以便删除$array[0][0][0]和$array[0][1]。显然,我需要对数组重新编号。

我需要能够搜索任何键/值对。。。一次只需要一双。。。也就是说,"44"的"formId"的上述示例下次可能是"16"的"viewId"。

我已经尝试了很多方法来做到这一点,使用迭代器、递归foreach循环,&参考钥匙,但我似乎就是搞不清楚。

Array
    (
    [0] => Array
    (
        [formId] => 0
        [subId] => 0
        [viewId] => 0
        [id] => 0
        [children] => Array
        (
            [0] => Array
            (
                [formId] => 1
                [subId] => 0
                [viewId] => 16
                [id] => _st_node_5328_0_0
                [children] => Array
                (
                    [0] => Array
                    (                                           
                        [formId] => 1
                        [subId] => 0
                        [viewId] => 16  
                        [id] => _st_node_3838_0_0_0
                        [children] => Array
                        (
                            [0] => Array
                            (
                                [formId] => 44
                                [subId] => 
                                [viewId] => 16   
                                [id] => _st_node_947_0_0_0_0
                            )
                            [1] => Array
                            (   
                                [formId] => 7
                                [subId] => 
                                [viewId] => 16
                                [id] => _st_node_947_0_0_0_1
                            )
                            [2] => Array
                            (
                                [formId] => 3
                                [subId] => 
                                [viewId] => 16
                                [id] => _st_node_947_0_0_0_2 
                            )
                            [3] => Array
                            (
                                [formId] => 10
                                [subId] => 
                                [viewId] => 16
                                [id] => _st_node_947_0_0_0_3
                            )
                            [4] => Array
                            (
                                [formId] => 9
                                [subId] => 
                                [viewId] => 16                                                             
                                [id] => _st_node_947_0_0_0_4
                            )
                            [5] => Array
                            (
                                [formId] => 8
                                [subId] => 
                                [viewId] => 16
                                [id] => _st_node_947_0_0_0_5
                            )
                            [6] => Array
                            (
                                [formId] => 6
                                [subId] => 
                                [viewId] => 16
                                [id] => _st_node_947_0_0_0_6
                            )
                            [7] => Array
                            (                    
                                [formId] => 5
                                [subId] => 
                                [viewId] => 16
                                [id] => _st_node_947_0_0_0_7
                            )
                            [8] => Array
                            (
                                [relId] => 167
                                [formId] => 4
                                [text] => Laptop Computers
                                [subId] => 
                                [viewId] => 16
                                [id] => _st_node_947_0_0_0_8
                                [isActive] => 
                            )
                            [9] => Array
                            (
                                [formId] => 1
                                [subId] => 
                                [viewId] => 16
                                [id] => _st_node_947_0_0_0_9
                            )
                        )
                    )
                    [1] => Array
                    (
                        [formId] => 1
                        [subId] => 0
                        [viewId] => 1
                        [id] => _st_node_3838_0_0_1
                    )
                    [2] => Array
                    (
                        [formId] => 1
                        [subId] => 0
                        [viewId] => 11
                        [id] => _st_node_3838_0_0_2
                    )
                    [3] => Array
                    (
                        [formId] => 1
                        [subId] => 0
                        [viewId] => 12
                        [id] => _st_node_3838_0_0_3
                    )
                    [4] => Array
                    (
                        [formId] => 1
                        [subId] => 0
                        [viewId] => 13
                        [id] => _st_node_3838_0_0_4
                    )
                    [5] => Array
                    (
                        [formId] => 1
                        [subId] => 0
                        [viewId] => 14
                        [id] => _st_node_3838_0_0_5
                    )
                    [6] => Array
                    (
                        [formId] => 1
                        [subId] => 0
                        [viewId] => 110
                        [id] => _st_node_3838_0_0_6
                    )
                )
            )
            [1] => Array
            (
                [formId] => 44
                [subId] => 0
                [viewId] => 144
                [id] => _st_node_5328_0_1
            )
            [2] => Array
            (
                [formId] => 10
                [subId] => 0
                [viewId] => 26
                [id] => _st_node_5328_0_2
            )
            [3] => Array
            (
                [formId] => 9
                [subId] => 0
                [viewId] => 9
                [id] => _st_node_5328_0_3
            )
            [4] => Array
            (
                [formId] => 8
                [subId] => 0
                [viewId] => 8
                [id] => _st_node_5328_0_4
            )
            [5] => Array
            (
                [formId] => 7
                [subId] => 0
                [viewId] => 25
                [id] => _st_node_5328_0_5
            )
            [6] => Array
            (
                [formId] => 6
                [subId] => 0
                [viewId] => 6
                [id] => _st_node_5328_0_6
            )
            [7] => Array
            (
                [formId] => 5
                [subId] => 0
                [viewId] => 5
                [id] => _st_node_5328_0_7
            )
            [8] => Array
            (
                [formId] => 4
                [subId] => 0
                [viewId] => 4
                [id] => _st_node_5328_0_8
            )
            [9] => Array
            (
                [formId] => 3
                [subId] => 0
                [viewId] => 3
                [id] => _st_node_5328_0_9
            )
        )
    )
)

想法

由于您希望取消设置元素,因此您肯定希望将$array作为引用(&$array)传递到函数中。

您希望使用递归来允许根据实际数组进行必要的深度挖掘。

循环遍历数组的所有元素,第一件事就是检查元素是否为数组。如果是,则检查该子数组是否符合您的条件。如果是,则移除它。如果不是,则调用该子数组上具有相同$key$value对的函数。

代码

function removeMatching($key, $value, &$arr) {
    // Iterate over all $arr elements
    foreach ($arr as $i => $subarr) {
        // Skip all elements that are not arrays
        if (is_array($subarr)) {
            // Check if the sub-array matches the criteria
            if (isset($subarr[$key]) && $subarr[$key] === $value) {
                // Remove it from the main array if it does
                unset($arr[$i]);
            } else {
                // If the sub-array didn't match the criteria
                // Check if it contains any other matching sub-arrays
                removeMatching($key, $value, $arr[$i]);
            }
        }
    }
}

像这样应用:

$array = []; // your array
removeMatching('formId', 44, $array);
var_dump($array);