项目数组

时间:2017-08-24 22:22:53

标签: php arrays recursion

解决

我试图非规范化(如果这是正确的词)一个项目数组。

每个项目都有qty。如果一个项目有f.e. qty的2我想添加相同的项目(副本)qty - 次数(减1,因为1已经存在)。

示例:

$items = [
    [
        'name' => 'Foo',
        'qty'  => 2, 
        'items'  => [
            [
                'name' => 'Bar',
                'qty'  => 2,
                'items'  => [
                    [
                        'name' => 'Baz',
                        'qty'  => 2,
                        'items'  => [],
                    ],
                ],
            ],
        ],
    ],
];
$expected = [
    [
        'name' => 'Foo',
        'qty'  => 1,
        'items'  => [
            [
                'name' => 'Bar',
                'qty'  => 1,
                'items'  => [
                    [
                        'name' => 'Baz',
                        'qty'  => 1,
                        'items'  => [],
                    ],
                    [
                        'name' => 'Baz',
                        'qty'  => 1,
                        'items'  => [],
                    ],
                ],
            ],
            [
                'name' => 'Bar',
                'qty'  => 1,
                'items'  => [
                    [
                        'name' => 'Baz',
                        'qty'  => 1,
                        'items'  => [],
                    ],
                    [
                        'name' => 'Baz',
                        'qty'  => 1,
                        'items'  => [],
                    ],
                ],
            ],
        ],
    ],
    [
        'name' => 'Foo',
        'qty'  => 1,
        'items'  => [
            [
                'name' => 'Bar',
                'qty'  => 1,
                'items'  => [
                    [
                        'name' => 'Baz',
                        'qty'  => 1,
                        'items'  => [],
                    ],
                    [
                        'name' => 'Baz',
                        'qty'  => 1,
                        'items'  => [],
                    ],
                ],
            ],
            [
                'name' => 'Bar',
                'qty'  => 1,
                'items'  => [
                    [
                        'name' => 'Baz',
                        'qty'  => 1,
                        'items'  => [],
                    ],
                    [
                        'name' => 'Baz',
                        'qty'  => 1,
                        'items'  => [],
                    ],
                ],
            ],
        ],
    ],
];

脚本(递归测试):

function func(array $items, array &$r)
{
    foreach ($items as $item) {
        for ($i = 1; $i <= $item['qty']; $i++) {
            echo "{$item['name']}\r\n";
            func($item['items'], $r);
        }
    }
}

$r = [];
func($items, $r);
file_put_contents('tmp/_test.php', "<?php return\r\n" . var_export($r, true) . ";");

输出:

Foo
    Bar
        Baz
        Baz
    Bar
        Baz
        Baz
Foo
    Bar
        Baz
        Baz
    Bar
        Baz
        Baz

到目前为止一切顺利。 但我无法将项目正确分类为$r

感谢您的帮助。

对不起。当我重新阅读自己的帖子时,我想到了解决方案。 我被困在参考文献中。但我应该已经返回了items数组。

工作脚本:

function func(array $items)
{
    $_items = [];
    $n = 0;
    foreach ($items as $item) {
        for ($i = 1; $i <= $item['qty']; $i++) {
            echo "{$item['name']}\r\n";
            $_items[$n] = $item;
            $_items[$n]['qty'] = 1;
            $_items[$n]['items'] = func($item['items']);
            $n++;
        }
    }
    return $_items;
}

$r = func($items);
file_put_contents('tmp/_test.php', "<?php return\r\n" . var_export($r, true) . ";"); 

1 个答案:

答案 0 :(得分:1)

您可以压缩解决方案并取消$n计数器 我从$i开始0,因此只需要<来维护逻辑。
我使用++$i代替$i++作为微优化 我已经重命名了函数和变量,因为我发现它有点混乱,变量名称非常相似,而且函数不具有描述性。

我使用2,2,22,0,2,1,2,33,2,1对此进行了测试,但我的更改并没有损坏结果。我认为这和我能做到的一样严密。

代码:(Demo

function expand(array $array){
    $expanded=[];
    foreach($array as $sub){
        for($i=0; $i<$sub['qty']; ++$i){
            $expanded[]=['name'=>$sub['name'],'qty'=>1,'items'=>expand($sub['items'])];
        }
    }
    return $expanded;
}

$items = [
    [
        'name' => 'Foo',
        'qty'  => 2, 
        'items'  => [
            [
                'name' => 'Bar',
                'qty'  => 2,
                'items'  => [
                    [
                        'name' => 'Baz',
                        'qty'  => 2,
                        'items'  => [],
                    ],
                ],
            ],
        ],
    ],
];

var_export(expand($items));