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

时间:2016-05-04 10:43:42

标签: php arrays json

我在PHP中有一个混合索引/关联数组,理论上可以无限深,因为某些元素可能有“孩子”。阵列。我附上一个瘦身的例子。 php数组派生自一些JSON数据。

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

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

我需要能够搜索任何键/值对...一次只需要一对...也就是说,上面的例子是' formId' ' 44'可能是' viewId' ' 16'下次。

我尝试了很多方法,使用迭代器,递归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
            )

        )

    )
)

1 个答案:

答案 0 :(得分:1)

想法

由于您要取消设置元素,您肯定希望将$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);