Php 折叠多维关联数组,以便在所有子节点都为false时将节点转换为false

Php 折叠多维关联数组,以便在所有子节点都为false时将节点转换为false,php,multidimensional-array,Php,Multidimensional Array,我有一个多维关联数组,其中每个节点都可以有数量可变的子节点。每个子节点将在某个点以布尔节点结束。我想做的是,如果所有子节点都以false结尾,那么父节点将从数组更改为布尔false 输入数组示例: [ [Agronomy] => [ [blendingAnhydrous] => [ [blendingSprayOrdersDeliveryTkts] => [ [add] => true,

我有一个多维关联数组,其中每个节点都可以有数量可变的子节点。每个子节点将在某个点以布尔节点结束。我想做的是,如果所有子节点都以false结尾,那么父节点将从数组更改为布尔false

输入数组示例:

[
    [Agronomy] => [
        [blendingAnhydrous] => [
            [blendingSprayOrdersDeliveryTkts] => [
                [add] => true,
                [create] => true,
                [inquire] => true,
                [delete] => true
            ],
            [historyInquiry] => [
                [add] => false,
                [create] => true,
                [inquire] => false,
                [delete] => true
            ],
            [listAnhydrousTicketsToBeBilled] => [
                [add] => false,
                [create] => false,
                [inquire] => false,
                [delete] => false
            ],
        ],
        [main] => [
            [agronomyBlendingAnhydrousEntry]: false,
            [agronomyRecomendationsHistory]: false,
            [agronomyReports]: false,
            [agronomySetup]: false
        ],
    ],
    [Grain] => [
        [main] => [
            [option1] => false,
            [option2] => false,
            [option3] => false,
        ]
    ]
]
[
    [Agronomy] => [
        [blendingAnhydrous] => [
            [blendingSprayOrdersDeliveryTkts] => [
                [add] => true,
                [create] => true,
                [inquire] => true,
                [delete] => true
            ],
            [historyInquiry] => [
                [add] => false,
                [create] => true,
                [inquire] => false,
                [delete] => true
            ],
            [listAnhydrousTicketsToBeBilled] => false
        ],
        [main] => false
    ],
    [Grain] => false
]
所需输出阵列:

[
    [Agronomy] => [
        [blendingAnhydrous] => [
            [blendingSprayOrdersDeliveryTkts] => [
                [add] => true,
                [create] => true,
                [inquire] => true,
                [delete] => true
            ],
            [historyInquiry] => [
                [add] => false,
                [create] => true,
                [inquire] => false,
                [delete] => true
            ],
            [listAnhydrousTicketsToBeBilled] => [
                [add] => false,
                [create] => false,
                [inquire] => false,
                [delete] => false
            ],
        ],
        [main] => [
            [agronomyBlendingAnhydrousEntry]: false,
            [agronomyRecomendationsHistory]: false,
            [agronomyReports]: false,
            [agronomySetup]: false
        ],
    ],
    [Grain] => [
        [main] => [
            [option1] => false,
            [option2] => false,
            [option3] => false,
        ]
    ]
]
[
    [Agronomy] => [
        [blendingAnhydrous] => [
            [blendingSprayOrdersDeliveryTkts] => [
                [add] => true,
                [create] => true,
                [inquire] => true,
                [delete] => true
            ],
            [historyInquiry] => [
                [add] => false,
                [create] => true,
                [inquire] => false,
                [delete] => true
            ],
            [listAnhydrousTicketsToBeBilled] => false
        ],
        [main] => false
    ],
    [Grain] => false
]
到目前为止我已经尝试过的代码:

function collapseAuthorities(&$complexArray)
{
    $keepExpanded = false;
    foreach ($complexArray as $node => $value) {
        if (is_array($value)) {
            $this->collapseAuthorities($value);
            if (!$keepExpanded) {
                $value = false;
            }
        } elseif ($value === true) {
            $keepExpanded = true;
        }
    }
}

我已经讨论了很多关于多维数组的SO问题,但没有找到任何能够完全回答这种情况的答案。

您需要递归扫描$value:

$rewriteArray = array();
foreach($mainParentArray as $key=>$value) {

    $rewriteArray[$key] = decompose($value);

}

function decompose($value) {
    if (is_array($value)) {
        list($array_as_value, $false_found) = keyScan($value);
        if ($array_as_value) {
            dendriticReconstruct($value);
        } else {
            $return = $false_found ? false : $value;
        }
    } else {
        $return = $value;
    }
    return $return;
}

function keyScan($value) {
    $array_as_value = $false_found = false;
    foreach($value as $k=>$v) {
        if (is_array($v)) {
            $array_as_value = true;
            break;
        } else {
            if ($v === false) {
                $false_found = true;
                break;
            }
        }
    }
    return array($array_as_value, $false_found);
}

function dendriticReconstruct($value) {

    //use method found at this post ---> http://stackoverflow.com/questions/2504685/php-find-parent-key-of-array

}

我不能完全完成它——它花了我太长时间。我希望这能让你从正确的方向开始

您需要递归扫描$value:

$rewriteArray = array();
foreach($mainParentArray as $key=>$value) {

    $rewriteArray[$key] = decompose($value);

}

function decompose($value) {
    if (is_array($value)) {
        list($array_as_value, $false_found) = keyScan($value);
        if ($array_as_value) {
            dendriticReconstruct($value);
        } else {
            $return = $false_found ? false : $value;
        }
    } else {
        $return = $value;
    }
    return $return;
}

function keyScan($value) {
    $array_as_value = $false_found = false;
    foreach($value as $k=>$v) {
        if (is_array($v)) {
            $array_as_value = true;
            break;
        } else {
            if ($v === false) {
                $false_found = true;
                break;
            }
        }
    }
    return array($array_as_value, $false_found);
}

function dendriticReconstruct($value) {

    //use method found at this post ---> http://stackoverflow.com/questions/2504685/php-find-parent-key-of-array

}

我不能完全完成它——它花了我太长时间。我希望这能让你从正确的方向开始

这更接近,但它崩溃了[农艺学],尽管它有一个真正的子节点。我得到了这个:
[[Agronomy]=>false,[Grain]=>false]
而不是上面想要的输出。如果任何子级为true,则阵列节点需要保持展开状态。只有当所有子项都为false时才折叠。是否将其折叠为单个false?正如在[Agronomy]=>false中一样,它崩溃为
[[Agronomy]=>false,[Grain]=>false]
我无法完成这项工作,因为它花费了我太长的时间-我希望我的回答能帮助你完成你的任务它看起来确实在正确的轨道上。感谢您在这方面花费的时间和精力。这更近了,但它崩溃了[农艺学],尽管它有一个真正的子节点。我得到了这个:
[[Agronomy]=>false,[Grain]=>false]
而不是上面想要的输出。如果任何子级为true,则阵列节点需要保持展开状态。只有当所有子项都为false时才折叠。是否将其折叠为单个false?正如在[Agronomy]=>false中一样,它崩溃为
[[Agronomy]=>false,[Grain]=>false]
我无法完成这项工作,因为它花费了我太长的时间-我希望我的回答能帮助你完成你的任务它看起来确实在正确的轨道上。感谢您在这方面花费的时间和精力。