繁体   English   中英

如何检测多维元素数组中的循环 php

[英]How to detect a cycle in an multidimensional array of elements php

我不确定如何实现这个,但我会解释我的问题。 我有一系列产品,这些产品有一个产品 ID 以及一个父产品 ID。 所以像这样

productsArray{
productID = 624
name = PS4
...
parentProductID = 5388
}

我需要帮助的是如何检查产品父级是否已经被访问过,我假设这会找到一个循环,如果没有循环我想将该项目添加到数组中。 但是我不确定 go 究竟如何做到这一点。

设置一个简单的产品列表。

$productsArray = [
    [
        'productID'       => 624,
        'name'            => 'PS4',
        'parentProductID' => 5388,
    ],
    [
        'productID'       => 123,
        'name'            => 'PS5',
        'parentProductID' => 7896,
    ],
];

现在,我们创建访问列表。

将 ID 转换为字符串,以防止数字索引数组,因为它们从 0 开始。将 ID 作为键放入visited[] ,将计数作为值。 如果 key 不存在,则从 1 开始,否则递增。

$visited = [];
foreach ($productsArray as $product) {
    foreach ($product as $key => $id) {
        if (in_array($key, ['productID', 'parentProductID'])) {
            $id           = (string) $id;
            $visited[$id] = isset($visited[$id]) ? $visited[$id]++ : 1;
        }
    }
}

现在,让我们有一个产品并验证它已经被访问过。 如果是,请不要添加。 此示例在已访问列表中,因此我们不会将其添加为重复项。

$newProduct = [
    'productID'       => 123,
    'name'            => 'PS5',
    'parentProductID' => 7896,
];

addToProducts($visited, $productsArray, $newProduct);

function addToProducts(array &$visited, array &$productsArray, array $newProduct): void
{
    // Get IDs as string
    $id1 = isset($newProduct['productID'])       ? (string) $newProduct['productID']       : '';
    $id2 = isset($newProduct['parentProductID']) ? (string) $newProduct['parentProductID'] : '';
    
    // Any ID is already visited, then return
    if(isset($visited[$id1]) || isset($visited[$id2])) {
        return;
    }
    
    // Put IDs into visited
    $visited[$id1] = isset($visited[$id1]) ? $visited[$id1]++ : 1;
    $visited[$id2] = isset($visited[$id2]) ? $visited[$id2]++ : 1;

    // Add Product
    $productsArray[] = $newProduct;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM