PHP: İç içe kümelerinden verileri sıralama

3 Cevap php

We're currently building a website with a categorized MySQL table containing various competences, and we noticed that the nested set model would be optimized for this. Although, we've got a pretty serious problem - the nested set model doesn't allow any sorting, and we really need that possibility. I'd like the output data to be array(id, name, depth), as this function supports (though without any kind of sorting):

function tree()
{
    $query = 'SELECT node.id, node.name, (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.lft';
    $result = mysql_query($query) or die(mysql_error());

    while($data = mysql_fetch_assoc($result))
    {
    	$returnarray[] = $data;
    }

    return $returnarray;
}

Ben bir fonksiyonu ile başladı ama devam etmek nasıl hiçbir fikrim yok ettik:

function tree_sorted()
{
    //Get data
    $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.lft';
    $result = mysql_query($query) or die(mysql_error());

    //Fetch gotten data
    while($data = mysql_fetch_assoc($result))
    {
    	$fetched[$data['depth']][$data['id']] = array($data['name'], $data['parent']);
    }

    //Sort fetched data
    foreach($fetched as $i => $row)
    {
    	asort($row);
    	$sorted[$i] = $row;
    }

    //Merge sorted data (???)
    foreach($sorted as $i => $arr)
    {
    	foreach($arr as $x => $row)
    	{
    		$returnarray[] = array('id' => key($row), 'name' => $row[0], 'depth' => $x);
    	}
    }

Herhangi bir yardım büyük mutluluk duyacağız. Ben ancak herhangi bir iyi sonuç olmaksızın, iç içe setleri verileri sıralamak için farklı yollar için google'dan.

Şimdiden teşekkür ederim.

EDIT: Şimdi doğru yol olarak hissediyor uasort () fonksiyonu ile bazı denedim, ama sorun hala devam etmektedir.

3 Cevap

Eğer bir ağaç düğüm kümesini sıralamak ve ağaç düzeylerinin sınırsız sayıda korumak gerekiyorsa, ben ön-sipariş ağacı kastetmek kullanarak önerebilir?

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/, bir örnek için bkz.

Nokta her düğüm için sol ve sağ değerini korumak olduğunu. Ayrıca, belirli bir tek seçmek Sen ağaç sırasına göre düğümleri çözmek için bu sol ve sağ değerleri kullanmak, ve derinlik değerini kullanabilirsiniz içeri o ağacın hangi düzeyde söyler her düğüm için bir derinlik sütun, korumak olabilir Ağacın seviyelerinin sayısı.

Bu yaklaşımın tek önemli dezavantajı düğümlerin yapısını değiştirerek zaman aktif olan sol ve sağ değerlerini korumak zorunda olduğunu.

Eğer gerçekten ağır trafik beklediğiniz sürece benim deneyim iç içe set modelini kullanarak gerçekten gerekli değildir. Senin için hiyerarşisini ihtiyaç tam olarak emin değilim, ama bunun önünde bir önbellek ile basit bir ebeveyn-oğul-tablo yeterli olmaz mı kontrol öneriyoruz, onu korumak ve çalışmak çok daha kolay

Yine, tabii ki bu uygulamaya bağlıdır ve performans konuları hakkında ne kadar endişeli.

İç içe set-ağaç veri olduğundan bunu sıralamak için başka bir formatta (genellikle düz bir) verileri dönüştürmek için gereken gibi karanlıkta bir bıçak alarak, tanımı gereği, zaten sıralanmış, bu sesler. Bunu başarmak için en kolay yolu sadece gitmek gibi düz bir veri kümesi oluşturma, veri üzerinden çalışmaktır.

Zaten SQL birkaç seçeneğiniz var. Ben terminoloji doğru varsa Sol kimliği ile sipariş, size içinde sipariş traversali alır. Bu bir liste halinde basık zaman mantıklı olarak bir set-ağaç listelemek insanların istediklerini genellikle. Ben SQL ORDER BY fıkra ile deneme olurdum; Örneğin, derinlik parametresi tarafından sipariş bir seviye sipariş kastetmek verecekti. node.name ile bu birleştirerek deneyin.