Algoritma Tek Boyutlu Array verileri kullanarak çok boyutlu dizi oluşturma

2 Cevap php

Ben PHP nesneleri bir tek boyutlu bir dizi var. Her nesne bir özellik nesnenin benzersiz bir kimliktir ve diğer üst olan dizide başka bir nesnenin benzersiz bir kimliktir, iki niteliği vardır. Örneğin:

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)
  }
}

Ben çok boyutlu bir diziye bu tek-boyutlu bir dizi dönüştürmek gerekir. Ben bu birkaç saplamanız almış ama yuvalama her seviye için bir döngü kalmadan halletmek için bir yol bulamıyorum. Algoritması yuvalama için varsayımsal sonsuz seviyeleri adapte edebilmek gerekiyor. Bazı özyineleme teknikleri kullanarak denedim ama oldukça doğru kazanılmış hiç.

Karmaşıklık biraz eklemek için, ben alıyorum dizideki nesnelerin bir sensical sırayla her zaman değil. Yukarıda benim örnekte bu çoğaltmak için çalıştı; Eğer 3 kimliği ile nesne 2 kimliği ile nesneyi önce dizide geldiğini fark edeceksiniz. yüzden onların irade muhtemelen de dahil bir sıralama algoritması.

İdeal Yukarıdaki örnek bu gibi bir şey açacak:

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

                )

        )

)

2 Cevap

Bu algoritmayı deneyin:

// 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);

Kimlikleri düğümlerine doğrudan atlamak için ($idtable) için bir arama tablosu kullanılır.

Yani, sadece bir habercisi gibi - Gerçekten tüm, php bilmiyorum. Ben öncelikle bir c-tarzı dil geliştirici (aka C, Objective C ve Java) duyuyorum. Yani bu biraz php yapmak zor olabilir, ama burada ben yapmak istiyorum girişimi:

//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;
            }
        }
    }
}

Birkaç not: Ben işaretçileri ile her şeyi etrafında geçen varsayarak yaşıyorum. Eğer nesnelerin kopyalarını yapıyoruz, imkansız zordur, ama değil. Ben de dinamik dizinin boyutunu değiştirebilirsiniz varsayarak yaşıyorum. Yine, ben php de farkında değilim - Bunu yapamam, o zaman bu davranışı yapmak için bir usul yol gerekir. Java Ben bir liste türünü kullanın, ya da sadece dizi kopyalamak ve yeniden sıfırlamak olacaktır.

- Nerede olurlarsa olsunlar - tek geçişte bu algoritma çalışma için anahtar çocukların ebeveyn altına olmasıdır. Bu olursa olsun düzen, hiyerarşi o tek geçişte oluşturulacak, demektir. Eğer örnekte göstermek ebeveyn etrafında sarıcı dizi gerekiyorsa, sadece kodun sonuna kadar böyle bir şey ekleyebilirsiniz:

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

Umarım bu yardımcı olur.