【问题标题】:PHP - Recursive adding subcategoriesPHP - 递归添加子类别
【发布时间】:2016-07-18 19:16:18
【问题描述】:

虽然这看起来很简单,但我已经为这个案子苦苦挣扎了好几天,一直没能找到解决办法。我用以下几行来解释它:

我有什么

我有两个数组:一个具有 categories 的顺序,另一个具有这些 categories 的值。如下:

$orders = 
    [
        {
            category: 3
        },
        {
            category: 8
        }
    ];

$values = 
    {
        3: [
            {
                id: 1,
                value: 'Value 1' 
            },
            {
                id: 2,
                value: 'Value 2'
            },
            {
                id: 3,
                value: 'Value 3'
            }
        ],
        8: [
            {
                id: 6,
                value: 'Value 6' 
            },
            {
                id: 7,
                value: 'Value 7'
            }
        ]
    };

如您所见,有 2 个类别,但它们可以更多(实际上,最多 10 个)。

编辑

result 与其他变量之间的关系是,如您所见,类别 3 的值与 id 1、2 和 3 相同。因此,类别 3 是 order 数组中的第一个,我需要获取类别 3 中的每个类别。

因此,作为一个解释示例,类别 3.1(以及 3.2 和 3.3)应该有内部子类别 8.6 和 8.7。

我需要什么

考虑到顺序,我需要让它们成为前一个的子类别。因此,由于顺序是第一个类别编号 3,然后是类别编号 8,因此类别 3 的每个值必须在类别 8 的所有值中(依此类推,如果添加更多类别,则下一个类别的每个值将属于第 8 类)。

所以我需要的是以下结果:

 $result = 
    [
        {
            category: {id: 1}, // Category 3 first value
            subcategories: [
                {
                    category: {id: 6} // Category 8 first value
                },
                {
                    category: {id: 7} // Category 8 second value
                }
            ]
        },
        {
            category: {id: 2}, // Category 3 second value
            subcategories: [
                {
                    category: {id: 6} // Category 8 first value
                },
                {
                    category: {id: 7} // Category 8 second value
                }
            ]
        },
        {
            category: {id: 3}, // Category 3 third value
            subcategories: [
                {
                    category: {id: 6} // Category 8 first value
                },
                {
                    category: {id: 7} // Category 8 second value
                }
            ]
        }
    ]

我尝试过的

我无法编写我尝试过的所有方法,但我似乎找不到合适的解决方案。

我尝试过递归函数(我认为这是实现此功能的正确方法),但我能得到的只是 'Stack call exceeded' 之类的错误。

声明

数据源是开放的,因此适合更改。但是,我想保持这种方式,因为这种结构对未来有影响——尽管如果有必要,它们也可以改变。

【问题讨论】:

  • 我不太了解“我需要什么”部分下的 $result 对象。 $orders 如何翻译成$result?我什至没有看到第 8 类。
  • 我已经编辑了这个问题(在我有什么下),所以它更清楚。感谢您抽出宝贵时间,很抱歉让您感到困惑。

标签: php recursion nested


【解决方案1】:

我想我明白了!

这是我正在使用的代码,至少目前是有效的(我可以添加任意数量的orders):

$result = array();
$objtoadd = array();

for($i = sizeof($orders)-1; $i >= 0; $i--){

    $objtoadd[$i] = array();
    $objtoadd[$i]['subcategories'] = array();

    $act_gr = $orders[$i];
    $obj;

    foreach($values[$act_gr->category] as $sub){

        $obj = array();
        $obj['category'] = $sub;

        if(isset($objtoadd[$i+1]) && sizeof($objtoadd[$i+1]['subcategories']) > 0) $obj['subcategories'] = $objtoadd[$i+1]['subcategories'];

        $objtoadd[$i]['subcategories'][] = $obj;

    }

    if($i === 0 && isset($objtoadd[$i]) && isset($objtoadd[$i]['subcategories'])) $result = $objtoadd[$i]['subcategories'];

}

echo json_encode($result);

感谢大家的时间和答案,以及您的耐心等待!

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2012-03-18
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多