【问题标题】:PHP Array: Generate a id_path and level from id and parenth idPHP Array:从 id 和 parent id 生成 id_path 和 level
【发布时间】:2020-11-21 11:08:54
【问题描述】:

从此表中:
From this table

我在 PHP 中得到这个数组: array in PHP

我想向这个数组添加一个新行,我知道 category_id 和 parent_id,我如何编程 id_path 和 level ?

编辑1: 例如最后一行:category_id:107 , parent_id:106,如何编码 id_path=96/106/107 和级别? id_path:由斜线分隔的类别 ID 序列

编辑2:

    function test() {
        $arGiven = [ 
            [
                'category_id' => 100,
                'parent_id' => 107,
                'id_path' => '',
                'level' => 0,
            ],
            [
                'category_id' => 106,
                'parent_id' => 96,
                'id_path' => '',
                'level' => 0,
            ],
            [
                'category_id' => 107,
                'parent_id' => 106,
                'id_path' => '',
                'level' => 0,
            ]

        ];

        $arExpected = [ 
            [
                'category_id' => 100,
                'parent_id' => 107,
                'id_path' => '96/106/107/100',
                'level' => 4,
            ],
            [
                'category_id' => 106,
                'parent_id' => 96,
                'id_path' => '96/106',
                'level' => 2,
            ],
            [
                'category_id' => 107,
                'parent_id' => 106,
                'id_path' => '96/106/107',
                'level' => 3,
            ]

        ];

        $result = $arGiven;

        return $result;
    }

编辑3: 我用这段代码试了一下:

    function test() {
        $arGiven = [ 
            [
                'category_id' => 100,
                'parent_id' => 107,
                'id_path' => '',
                'level' => 0,
            ],
            [
                'category_id' => 106,
                'parent_id' => 96,
                'id_path' => '',
                'level' => 0,
            ],
            [
                'category_id' => 107,
                'parent_id' => 106,
                'id_path' => '',
                'level' => 0,
            ]

        ];

        $arExpected = [ 
            [
                'category_id' => 100,
                'parent_id' => 107,
                'id_path' => '96/106/107/100',
                'level' => 4,
            ],
            [
                'category_id' => 106,
                'parent_id' => 96,
                'id_path' => '96/106',
                'level' => 2,
            ],
            [
                'category_id' => 107,
                'parent_id' => 106,
                'id_path' => '96/106/107',
                'level' => 3,
            ]

        ];

        $arrays = $arGiven;

        function getParent($arr, $parent){
            foreach($arr as $v){
                if($v['parent_id'] == $parent) return $v['parent_id'];
            }
        
          return false;
        }

        $newArray=[];
        $i = 0;
        foreach ($arrays as $array){
            $newArray[] = $newArray[$i-1] . '/'. getParent($arrays, $array['parent_id']);
            $i++;
        }

        $test=1;
        return $array;
    }

但是 $newArray 是

[ 
  "/107",
  "/107/96",
  "/107/96/106"
]

代替:

[
    '96/106/107/100',
    '96/106',
    '96/106/107'
]

【问题讨论】:

  • 我不太明白你的问题,你想在数组末尾添加一行你已经拥有的变量吗?到目前为止你做了什么?你得到什么错误?
  • 如何使用 foreach 或 array.map 生成 id_path 和级别?查看图片以获取新行。我需要一个新功能。
  • 我在stackoverflow.com/questions/16150199/… 中找到了用于生成 id_path 的方法,但我找不到将示例更改为我的数组的解决方案,以便 id 路径与图片上的一样。
  • 好的,到目前为止你尝试了什么?你会得到哪些错误?给我们看一些代码,否则我们无法帮你调试任何东西。
  • 我已经用实际和目标扩展了这个问题。我尝试再次从另一个线程重写示例,当我尝试时,它不起作用,然后写入结果。

标签: php arrays recursion


【解决方案1】:

我相信它真的可以优化:

<?php
    $arGiven = [ 
    // add the root category
        [
            'category_id' => 96,
            'parent_id' => 0,
            'id_path' => '',
            'level' => 0,
        ],
        [
            'category_id' => 100,
            'parent_id' => 107,
            'id_path' => '',
            'level' => 0,
        ],
        [
            'category_id' => 106,
            'parent_id' => 96,
            'id_path' => '',
            'level' => 0,
        ],
        [
            'category_id' => 107,
            'parent_id' => 106,
            'id_path' => '',
            'level' => 0,
        ]
    ];

    $level = 0;
    $parentLevelIds = [0];
    do {
        $level++;
        
        $nextParentLevelIds = [];
        $arGiven = array_map(function($value) use($level, $parentLevelIds, &$nextParentLevelIds, $arGiven) {
            if (in_array($value['parent_id'], $parentLevelIds)) {
                $path = '';
                if ($value['parent_id'] !== 0) {
                    $parent = array_filter($arGiven, function($parentSearchValue) use ($value) {
                        return $parentSearchValue['category_id'] == $value['parent_id'];
                    });
                    if (!empty($parent)) {
                        $path = array_shift($parent)['id_path'];
                    }
                }
                $value['level'] = $level;
                $value['id_path'] = empty($path) ? $value['category_id'] : ( $path . '/' . $value['category_id'] );
                $nextParentLevelIds[] = $value['category_id'];
            }
            return $value;
        }, $arGiven);

        $parentLevelIds = $nextParentLevelIds;

        $hasLevel0 = !empty(array_filter($arGiven, function($value) {
            return $value['level'] == 0;
        }));
    } while ($hasLevel0);

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 2012-03-28
    • 2011-06-14
    • 1970-01-01
    • 2012-03-12
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多