我有PHP对象的一维数组。每个对象具有两个属性,一个属性是对象的唯一的ID,而另一个是它的父阵列中的另一个对象的唯一ID。例如:

array(3) {
  [0]=>
  object(stdClass)#1 (2) {
    ["ID"]=>
    int(1)
    ["parentID"]=>
    int(0)
  }
  [1]=>
  object(stdClass)#2 (2) {
    ["ID"]=>
    int(3)
    ["parentID"]=>
    int(2)
  }
  [2]=>
  object(stdClass)#3 (2) {
    ["ID"]=>
    int(2)
    ["parentID"]=>
    int(1)
  }
}

我需要这个一维数组转换成多维数组。我已在这几个刺,但我找不到得到它,而不必为每个嵌套层次的循环进行的方式。该算法需要能够适应嵌套的假设无限的水平。我已经使用一些递归方法试过,但我从来没有得到完全正确。

要增添几分复杂性,所述阵列中的是我收到的对象并不总是一个无意义的顺序。我试着在我上面的例子复制此;你会发现,与3的ID的对象来在阵列中为2。ID的对象之前所以它们可能会被卷入以及一个排序算法。

理想情况下上面的例子中会变成这样的:

Array
(
    [0] => Array
        (
            [ID] => 1
            [parentID] => 0
            [0] => Array
                (
                    [ID] => 2
                    [parentID] => 1
                    [0] => Array
                        (
                            [ID] => 3
                            [parentID] => 2
                        )

                )

        )

)
有帮助吗?

解决方案

尝试该算法:

// sort objects by parentID
function cmpNodes($a, $b) {
    return $a->parentID - $b->parentID;
}
usort($objects, 'cmpNodes');

// define first node as root of tree
$tree = (array) array_shift($objects);
// lookup table for direct jumps
$idTable = array($tree['ID'] => &$tree);
foreach ($objects as $object) {
    $node = (array) $object;
    // test if parent node exists
    if (!isset($idTable[$node['parentID']])) {
        // Error: parent node does not exist
        break;
    }
    // append new node to the parent node
    $idTable[$node['parentID']][] = $node;
    // set a reference in the lookup table to the new node
    $idTable[$node['ID']] = &$idTable[$node['parentID']][count($idTable[$node['parentID']])-3];
}
// unset($idTable);
var_dump($tree);

我使用的查找表($idtable)为ID,以直接跳到节点。

其他提示

因此,正如前体 - 我不知道PHP,真的都没有。我主要是C风格的语言开发(又名C,目的C和Java)。因此,一些本可能会更困难PHP做的,但这里是我的尝试将使:

//the original input array
oldArray;
//the output array
array[] newArray = new array[];

foreach (element : oldArray) {
    //if the element is at the top, put it at the top of the array
    if (element.parentId == 0) {
        newArray.add(element);
    } else {
        //otherwise, find it's parent and put it in the child array of the parent
        for (potentialParent : oldArray) {
            if (potentialParent.id = element.parentId) {
                potentialParent.array.add(element);
                break;
            }
        }
    }
}

有两点要注意:我假设你周围的一切传递的指针。如果你的对象的复印,这是很难,但并非不可能。我也假设你可以动态改变数组的大小。同样,我也不是太了解PHP了 - 如果你不能做到这一点,那么你就需要一个程序性的方式来做到这一点的行为。在Java中我会用一个列表的类型,或者只复制阵列,并再次重新设置。

该算法的工作的关键是,在儿童被其父下放置 - 无论他们在哪里 - 在一次通过。这意味着,不论顺序,层级将在单通道创建。如果你需要身边,你在你的例子显示父包装数组,你可以简单地添加像这样的代码的末尾:

finalArray = new array[];
finalArray[0] = newArray;

希望这有助于。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top