簡體   English   中英

利用單維數據中的數據創建多維數組

[英]Create Multi-Dimensional Array With Algorithm Using Data in Single-Dimensional Array

我有一個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)
  }
}

我需要將這個單維數組轉換為多維數組。 我已經對此進行了一些嘗試,但是如果沒有針對每個嵌套級別的循環,我找不到完成它的方法。 該算法需要能夠適應假設無限級別的嵌套。 我嘗試過使用一些遞歸技術,但我從來沒有把它弄得恰到好處。

為了增加一點復雜性,我得到的數組中的對象並不總是處於一種感性的順序。 我試圖在上面的例子中復制這個; 你會注意到ID為3的對象在ID為2的對象之前進入數組。因此它們可能也是一個排序算法。

理想情況下,上面的例子會是這樣的:

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,Objective 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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM