解决
我试图非规范化(如果这是正确的词)一个项目数组。
每个项目都有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) . ";");
答案 0 :(得分:1)
您可以压缩解决方案并取消$n
计数器
我从$i
开始0
,因此只需要<
来维护逻辑。
我使用++$i
代替$i++
作为微优化
我已经重命名了函数和变量,因为我发现它有点混乱,变量名称非常相似,而且函数不具有描述性。
我使用2,2,2
,2,0,2,
,1,2,3
和3,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));