【问题标题】:Array with Objects add to new Array as Child带有对象的数组作为子对象添加到新数组
【发布时间】:2020-08-17 13:10:01
【问题描述】:

我现在感觉很愚蠢,我无法理解它

我有一个包含 stdClass 对象的数组,我想对它们进行新的排序或用它构建另一个数组

Array
(
    [0] => stdClass Object
        (
            [id] => 15
            [top_id] => 13
            [title] => Menu 6
            [online] => 1
            [displayOrder] => 15
        )

    [1] => stdClass Object
        (
            [id] => 14
            [top_id] => 13
            [title] => Menu 5
            [online] => 0
            [displayOrder] => 14
        )

    [2] => stdClass Object
        (
            [id] => 13
            [top_id] => 0
            [title] => Menu 4
            [online] => 0
            [displayOrder] => 13

        )

    [3] => stdClass Object
        (
            [id] => 12
            [top_id] => 11
            [title] => Menu 3
            [online] => 1
            [displayOrder] => 12
        )

)

我想要的数组是这样的

(
    [2] => stdClass Object
        (
            [id] => 13
            [top_id] => 0
            [title] => Menu 4
            [online] => 0
            [displayOrder] => 13
            [children] =>
            (
               [id] => 11
               [top_id] => 13
               [title] => Menu 2
               [online] => 0
               [displayOrder] => 11
               [children] =>
                (
                    [id] => 12
                    [top_id] => 11
                    [title] => Menu 3
                    [online] => 1
                    [displayOrder] => 12
                )
)

我今天尝试了很多我在网上找到的东西,但我无法理解正确的答案/或让它发挥作用

请向我展示正确方向的人,并解释一下为什么会这样?

谢谢你和最好的问候

【问题讨论】:

  • 到目前为止您已经尝试过什么?如果您向我们展示了您尝试过但不起作用的代码,并告诉我们您遇到的问题的详细信息,我们可以查看并帮助您使其正常工作。
  • 我第一次尝试 foreach 数组并开始添加到一个新数组,每个 obj 与 top_id= 0 并取消设置使用的 obj 但我不能更进一步,因为我该如何添加下一层,所以我被数组卡住了,里面有一个数组,我发现其他关于它的帖子我想不通,也许它只是一个真正的星期一,我需要睡在上面。现在我在家,我可以尝试发布明天的代码,但它完全没用,因为我的想法很糟糕,这就是为什么我问一个想法如何解决这个问题,我应该去哪里,我该如何以正确的方式处理这个问题跨度>

标签: php stdclass


【解决方案1】:

我对 php 不是很熟悉,但这里有一种方法可以解决 JS 的问题


function doOrderSort(a, b) {
  return parseInt(a.displayOrder) - parseInt(b.displayOrder);
}

function findAndAppendSubs(item, originItems) {
  var allItems = Object.assign([], originItems);
  var subItems = allItems.filter(inner => inner.top_id === item.id);


  if (subItems !== undefined && subItems.length > 0) {
    for (var i = 0; i < subItems.length; i++) {
      subItems[i] = findAndAppendSubs(subItems[i], allItems)
    }
    item.subItems = subItems.sort(doOrderSort);
  }
  return item;

}


function sortAndAppendAllSubs(itemList) {

  var allItems = Object.assign([], itemList);
  var topItems = allItems.filter(inner => parseInt(inner.top_id) === 0);
  var resultList = [];
  if (topItems !== undefined && topItems.length > 0) {
    for (var it = 0; it < topItems.length; it++) {
      resultList.push(findAndAppendSubs(topItems[it], allItems));
    }
  }
  return resultList.sort(doOrderSort);
}

https://jsfiddle.net/3b4s79L5/ (打开控制台查看结果:)

编辑:添加排序功能,如果字符串或数字作为 top_id 则忽略

【讨论】:

  • 欢迎来到 Stack Overflow。将来,如果问题被标记为一种语言,请不要以另一种语言提供答案。在这种情况下,它似乎对 OP 有所帮助,但这种情况很少见——在大多数情况下,它没有帮助,而且你可能会因为不回答所提出的实际问题而遭到反对。请注意,本网站上的问题和答案也旨在对未来的用户有所帮助,因此在给出答案时请牢记这一点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多