[英]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.