Frage

Ich habe ein Array mit Daten aus einer MySQL-Tabelle in Nested Sets bekommt Ich mag würde sortiert werden, nicht nur alphabetisch, sondern auch mit dem Kind direkt nach dem Elternknoten Knoten. Beispiel - Array sortiert werden (vor der Sortierung):

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Kompetenser
            [parent] => 0
            [depth] => 0
        )

    [1] => Array
        (
            [id] => 2
            [name] => Administration
            [parent] => 1
            [depth] => 1
        )

    [2] => Array
        (
            [id] => 11
            [name] => Organisation
            [parent] => 2
            [depth] => 2
        )

    [3] => Array
        (
            [id] => 4
            [name] => Arbetsledning
            [parent] => 2
            [depth] => 2
        )

    [4] => Array
        (
            [id] => 17
            [name] => Planering
            [parent] => 2
            [depth] => 2
        )

    [5] => Array
        (
            [id] => 9
            [name] => Hantverke
            [parent] => 1
            [depth] => 1
        )

    [6] => Array
        (
            [id] => 10
            [name] => Snickeri
            [parent] => 9
            [depth] => 2
        )

    [7] => Array
        (
            [id] => 12
            [name] => Språk
            [parent] => 1
            [depth] => 1
        )

    [8] => Array
        (
            [id] => 13
            [name] => Tolk
            [parent] => 12
            [depth] => 2
        )

    [9] => Array
        (
            [id] => 15
            [name] => Arabiska
            [parent] => 13
            [depth] => 3
        )

    [10] => Array
        (
            [id] => 14
            [name] => Persiska
            [parent] => 13
            [depth] => 3
        )

    [11] => Array
        (
            [id] => 16
            [name] => Polska
            [parent] => 13
            [depth] => 3
        )

    [12] => Array
        (
            [id] => 18
            [name] => Apotekare
            [parent] => 1
            [depth] => 1
        )

    [13] => Array
        (
            [id] => 19
            [name] => Dotkorand
            [parent] => 1
            [depth] => 1
        )

    [14] => Array
        (
            [id] => 21
            [name] => Atomfysik
            [parent] => 19
            [depth] => 2
        )

    [15] => Array
        (
            [id] => 20
            [name] => Fysik
            [parent] => 19
            [depth] => 2
        )

    [16] => Array
        (
            [id] => 22
            [name] => Ekonom
            [parent] => 1
            [depth] => 1
        )

    [17] => Array
        (
            [id] => 23
            [name] => Industriell ekonomi
            [parent] => 22
            [depth] => 2
        )

    [18] => Array
        (
            [id] => 24
            [name] => Filosofi
            [parent] => 1
            [depth] => 1
        )

)

Ich mag das Array auf diese Weise (nach der Sortierung):

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Kompetenser
            [parent] => 0
            [depth] => 0
        )

    [1] => Array
        (
            [id] => 2
            [name] => Administration
            [parent] => 1
            [depth] => 1
        )

    [3] => Array
        (
            [id] => 4
            [name] => Arbetsledning
            [parent] => 2
            [depth] => 2
        )

    [2] => Array
        (
            [id] => 11
            [name] => Organisation
            [parent] => 2
            [depth] => 2
        )

    [4] => Array
        (
            [id] => 17
            [name] => Planering
            [parent] => 2
            [depth] => 2
        )

    [12] => Array
        (
            [id] => 18
            [name] => Apotekare
            [parent] => 1
            [depth] => 1
        )

    [13] => Array
        (
            [id] => 19
            [name] => Dotkorand
            [parent] => 1
            [depth] => 1
        )

    [14] => Array
        (
            [id] => 21
            [name] => Atomfysik
            [parent] => 19
            [depth] => 2
        )

    [15] => Array
        (
            [id] => 20
            [name] => Fysik
            [parent] => 19
            [depth] => 2
        )

    [16] => Array
        (
            [id] => 22
            [name] => Ekonom
            [parent] => 1
            [depth] => 1
        )

    [17] => Array
        (
            [id] => 23
            [name] => Industriell ekonomi
            [parent] => 22
            [depth] => 2
        )

    [18] => Array
        (
            [id] => 24
            [name] => Filosofi
            [parent] => 1
            [depth] => 1
        )

    [5] => Array
        (
            [id] => 9
            [name] => Hantverke
            [parent] => 1
            [depth] => 1
        )

    [6] => Array
        (
            [id] => 10
            [name] => Snickeri
            [parent] => 9
            [depth] => 2
        )

    [7] => Array
        (
            [id] => 12
            [name] => Språk
            [parent] => 1
            [depth] => 1
        )

    [8] => Array
        (
            [id] => 13
            [name] => Tolk
            [parent] => 12
            [depth] => 2
        )

    [9] => Array
        (
            [id] => 15
            [name] => Arabiska
            [parent] => 13
            [depth] => 3
        )


    [10] => Array
        (
            [id] => 14
            [name] => Persiska
            [parent] => 13
            [depth] => 3
        )

    [11] => Array
        (
            [id] => 16
            [name] => Polska
            [parent] => 13
            [depth] => 3
        )

)

Wie Sie vielleicht sehen, möchte ich alle Beiträge mit Eltern 2 direkt nach der Post mit der ID 2, und so weiter.

Jede Hilfe wäre sehr geschätzt. Vielen Dank im Voraus.

War es hilfreich?

Lösung 4

Problem gelöst - ich zwei einfache Funktionen gemacht. Ich hoffe, dass andere Menschen als auch Verwendung dieses haben könnte:

class data_comp
{
    var $fetched_tree = array();

    function tree_fetch($parent = 0)
    {
        $query = 'SELECT node.id, node.name, node.parent, (COUNT(parent.name) - 1) AS depth FROM test_competence AS node, test_competence AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt GROUP BY node.name ORDER BY node.name';
        $result = mysql_query($query) or die(mysql_error());
        $tree = array();

        while($data = mysql_fetch_assoc($result))
        {
            $tree[$data['parent']][$data['id']] = array('name' => $data['name'], 'depth' => $data['depth']);
        }

        $this->tree_print($tree, $parent);
    }

    function tree_print($tree, $parent)
    {
        foreach($tree[$parent] as $id => $value)
        {
            $this->fetched_tree[] = array('id' => $id, 'name' => $value['name'], 'depth' => $value['depth']);

            if(isset($tree[$id]) && is_array($tree[$id]))
            {
                $this->tree_print($tree, $id);
            }
        }
    }
}

Vielen Dank für Ihre Zeit. Alle Verbesserungen sind mehr als willkommen.

Andere Tipps

Tun Sie dies nicht in PHP!

Der MySQL-Server specificly abzufragen und Sortieren von Daten entworfen, lesen Sie auf der MySQL " ORDER BY “Syntax. Tut dies auf dem MySQL-Server-Laufzeit, CPU-Last und Speicherverbrauch speichern.

Mit PHP uasort() Funktion, um Ihre eigene Vergleichsfunktion zu definieren.

Aber mit MySQL Sortierfunktionen wäre besser geeignet, wenn es in Ihrem Fall möglich ist.

Sie wollen es sortieren, wie es in der DB, mehrschichtig ist. Ich glaube nicht, uasort bei diesem Problem helfen können, weil Sie die Kinder an die Eltern anhängen möchten.

foreach ($arr as &$val) {
    $arr2[$val['id']] = &$val;
}

ksort($arr2);

foreach ($arr2 as $id => &$val) {
    $parent = $val['parent'];
    if ($parent == 0) {
        continue;
    }
    $arr2[$parent]['children'][$id] = &$val;
}

function flattenArrayByChildren($arr) {
    foreach ($arr as $id => $val) {
        if (isset($val['children'])) {
            $temp = flattenArrayByChildren($val['children']);
            unset($val['children']);
            $out[$id] = $val;
            $out = $out + $temp;
        } else {
            $out[$id] = $val;
        }
    }
    return $out;
}

$arr2 = array(1 => $arr2[1]);

$out = flattenArrayByChildren($arr2);

var_dump($out);

Wenn Sie unbedingt wollen, um den Schlüssel zu speichern, können Sie nur, dass in der ersten foreach zum $ val hinzufügen, und es in der rekursive Funktion flattenArrayByChildren abrufen und als Schlüssel verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top