我有一个提取所有食物类别的查询,一个递归迭代创建树的函数,最后还有一个递归函数,它在添加深度指示器的同时将其展平.

递归运行得很好.我很难把父母的面包屑传给每个子元素.每一层都必须有面包屑,即使是最后一层.

尽管碎屑累积要求当前 node 用于特定的父 node ,但该函数会以某种方式继承所有过go 的碎屑,甚至是来自其他父代的子 node 的碎屑. struct 的其余部分遵循父/子关系.我不明白为什么面包屑不能.

查询结果的一个小样本

$QueryResults = array
    (
        0 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 42
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => 1
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => '酗wine 者'
                            )
                    )
            ),
        1 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 39
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => 4
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => 'Beef'
                            )
                    )
            ),
        2 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 1
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => NULL
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => 'Beverages'
                            )
                    )
            ),
        3 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 44
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => 1
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => 'Carbon 酸饮料'
                            )
                    )
            ),
        4 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 46
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => 1
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => 'Coffee'
                            )
                    )
            ),
         5 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 4
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => NULL
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => 'Meats'
                            )
                    )
            ),
         6 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 44
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => 4
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => 'Processed Meats'
                            )
                    )
            ),
         7 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 45
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => 44
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => 'Luncheon Meats'
                            )
                    )
            ),
        8 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 7
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => 4
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => 'Pork'
                            )
                    )
            ),
        9 => array
            (
                'Fields' => array
                    (
                        0 => array
                            (
                                'FieldName' => 'id',
                                'Value' => 8
                            ),
                        1 => array
                            (
                                'FieldName' => 'parent_id',
                                'Value' => 4
                            ),
                        2 => array
                            (
                                'FieldName' => 'name',
                                'Value' => 'Poultry'
                            )
                    )
            )
    )
;

下面是我处理数据库查询结果的try (完成后树将变平).

function buildTree($elements, $parentId, $crumbs) {
  $branch = array();
  
  foreach ($elements as $element) {
    if ($element['Fields'][1]['Value'] == $parentId) {
      
      $currentCrumbs[] = array('Fields' => array(0 => array('FieldName' => 'id','Value' => $element['Fields'][0]['Value']),1 => array('FieldName' => 'Crumb','Value' => $element['Fields'][2]['Value'])));
      
      if (is_array($crumbs)) { // lower levels
        $combinedCrumbs = array_merge($crumbs, $currentCrumbs);
      } else { // top level
        $combinedCrumbs = $currentCrumbs;
      }
      $element['BreadCrumbs'] = $combinedCrumbs;
      
      $children = buildTree($elements, $element['Fields'][0]['Value'], $combinedCrumbs);
      if ($children) {
        $element['SubGroups'] = $children;
      }
      $branch[] = $element;
      
    }
  }
  
  return $branch;
}

数据库的这一部分是这样的,但其他部分的层次更深:

  • 饮料
    • 酗wine
    • Carbon 酸

整个 struct 需要很大的空间才能显示,所以这只是一个 node ,里面装着"Carbon 酸"饮料.它正确地携带了"饮料",但它也含有来自"wine 精"叶的碎屑,这不是"Carbon 酸"链的一部分.我不知道这个函数的"wine 精"实例中的碎屑是如何进入函数实例的"Carbon 酸"链的.树的其余部分可以正确构建.这不是一个地方性的问题--"Beverages"也进入了"Meats"顶级 node .

当前行为(注意"酗wine "是如何出现的):

[1] => Array
    (
        [Fields] => Array
            (
                [0] => Array
                    (
                        [FieldName] => id
                        [Value] => 44
                    )
                [1] => Array
                    (
                        [FieldName] => parent_id
                        [Value] => 1
                    )
                [2] => Array
                    (
                        [FieldName] => name
                        [Value] => Carbon 酸饮料
                    )
            )
        [BreadCrumbs] => Array
            (
                [0] => Array
                    (
                        [Fields] => Array
                            (
                                [0] => Array
                                    (
                                        [FieldName] => id
                                        [Value] => 1
                                    )
                                [1] => Array
                                    (
                                        [FieldName] => Crumb
                                        [Value] => Beverages
                                    )
                            )
                    )
                [1] => Array
                    (
                        [Fields] => Array
                            (
                                [0] => Array
                                    (
                                        [FieldName] => id
                                        [Value] => 42
                                    )
                                [1] => Array
                                    (
                                        [FieldName] => Crumb
                                        [Value] => 酗wine 者
                                    )
                            )
                    )
                [2] => Array
                    (
                        [Fields] => Array
                            (
                                [0] => Array
                                    (
                                        [FieldName] => id
                                        [Value] => 44
                                    )
                                [1] => Array
                                    (
                                        [FieldName] => Crumb
                                        [Value] => Carbon 酸饮料
                                    )
                            )
                    )
            )
    )

预期行为:

[1] => Array
    (
        [Fields] => Array
            (
                [0] => Array
                    (
                        [FieldName] => id
                        [Value] => 44
                    )

                [1] => Array
                    (
                        [FieldName] => parent_id
                        [Value] => 1
                    )

                [2] => Array
                    (
                        [FieldName] => name
                        [Value] => Carbon 酸饮料
                    )
            )
        [BreadCrumbs] => Array
            (
                [0] => Array
                    (
                        [Fields] => Array
                            (
                                [0] => Array
                                    (
                                        [FieldName] => id
                                        [Value] => 1
                                    )
                                [1] => Array
                                    (
                                        [FieldName] => Crumb
                                        [Value] => Beverages
                                    )
                            )
                    )
                [1] => Array
                    (
                        [Fields] => Array
                            (
                                [0] => Array
                                    (
                                        [FieldName] => id
                                        [Value] => 44
                                    )
                                [1] => Array
                                    (
                                        [FieldName] => Crumb
                                        [Value] => Carbon 酸饮料
                                    )
                            )
                    )
            )
    )

我理解这种 struct 比如果它是关联的而不是索引的可能需要的更详细和更深入,但由于不相关的原因和不明显的方式,它就是这样的.

我在扁平化的数组上做了一个单独的失败try ,它的parent_id完好无损,并添加了一个深度指示器,但那里的解决方案也可以工作.

我如何调整这一点,使其只累加给定链的碎屑?

推荐答案

调查了一下,这对我很管用:

function buildTree($elements, $parentId, $crumbs) {
  $branch = array();
    
  foreach ($elements as $element) {
    if ($element['Fields'][1]['Value'] == $parentId) {

      $currentCrumbs = array(array('Fields' => array(0 => array('FieldName' => 'id','Value' => $element['Fields'][0]['Value']),1 => array('FieldName' => 'Crumb','Value' => $element['Fields'][2]['Value']))));


      if (is_array($crumbs)) { // lower levels
        $combinedCrumbs = combineArrays($crumbs, $currentCrumbs);
      } else { // top level
        $combinedCrumbs = $currentCrumbs;
      }
      $element['BreadCrumbs'] = $combinedCrumbs;

      $children = buildTree($elements, $element['Fields'][0]['Value'], $combinedCrumbs);
      if ($children) {
        $element['SubGroups'] = $children;
      }
      $branch[] = $element;

    }
  }

  return $branch;
}

主要问题是您已经将元素附加到$currentCrumbs,如

$currentCrumbs[]= ...

因此,当有更多的元素要处理时,也就是说,有多个sibling 元素,例如wine 精和Carbon 酸饮料,其父项是Beverages,第一步是将wine 精添加到不存在的数组中,也就是说,将创建一个具有单个元素的新array.然后,当它进行到第二步时,也就是Carbon 酸,那么wine 精已经是$currentCrumbs,并向其添加Carbonated,导致两个元素的array.

相反,我在循环的每次迭代中创建一个新array.

此外,我在数组周围包装了一个数组,并分离了合并.结果是成功的:

enter image description here

Php相关问答推荐

CodeIgniter AJAX表格提交中的CSRF token 再生问题

从WooCommerce邮箱通知中的订单详细信息中删除产品列表

WooCommerce产品按特定元数据的自定义数字排序选项

WooCommerce:在 checkout 审核单和发票中显示定制产品数据

如何实现对数据库表中多列的唯一约束?

使用php ZipArhive类将Zip压缩文件分成多个部分

Laravel Carbon DiffForHumans选项(年,月,天)

Laravel路由到控制器传输变量解决方案需要

WooCommerce中特定付款方式的变更订单预留库存时间

无法在 WordPress 上获取 JSON 数据

Symfony:从控制器内部调用自定义命令

通过添加计数器修改文本区域表单中的重复值

从插件更改主题功能,function_exists 不起作用

PHP简单地将物品装在盒子里会导致未使用的空间,但还有剩余容量

根据WooCommerce中选定的变体重量更改输入数量步值

WooCommerce单个产品页面上启用额外选项卡的产品元框字段

在这个 Laravel 应用中,如何仅显示已批准的 comments 回复?

使用 PHP 正则表达式从仅包含具有现有顺序的顶级标签的 XML 文档中搜索和创建数组

PHP Loop 在迭代中使用修改后的数据

password_verify 在 PHP 7.4 中有效,但在 PHP 8.2 中无效