PHP: Bir diziyi sıralar

4 Cevap php

I've got an array with data from a MySQL table in nested set model I'd like to get sorted, not only alphabetical but also with the child nodes directly after the parent node. Example - array to be sorted (before the sorting):

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
        )

)

Ben Array (sıralama sonra) bu şekilde istiyorum:

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
        )

)

Gördüğünüz edebileceğiniz gibi, ben bu yüzden doğrudan id 2 mesajdan sonra ebeveyn 2 ile tüm mesajlarını istiyorum, ve.

Any help would be highly appreciated. Thank you in advance.

4 Cevap

Sorun çözüldü - Ben iki basit işlevi yaptı. Ben diğer insanlar da bu kullanımı olabilir umuyoruz:

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

Zaman ayırdığınız için teşekkür ederiz. Herhangi iyileştirmeler bekliyoruz daha vardır.

Don't do this in PHP!

MySQL sunucusu specificly MySQL üzerinde okumak, "ORDER BY" sözdizimi sorgu verileri VE sıralamak için tasarlanmıştır. MySQL sunucusu üzerinde bu Doing çalışma zamanı, CPU Load ve Bellek Tüketimi kurtaracak.

Kendi karşılaştırma işlevini tanımlamak için PHP'nin uasort() işlevini kullanın.

Bu durumda mümkün olmadığını ama MySQL'in sıralama özelliklerini kullanarak, daha uygun olurdu.

Bu, DB katmanlı gibi bunu sıralamak istiyorum. Ben ebeveyne çocukları eklemek istiyorum çünkü uasort bu sorunu yardımcı olabilir sanmıyorum.

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

Kesinlikle anahtarını kaydetmek istiyorsanız, sadece ilk foreach $ val eklemek ve özyinelemeli fonksiyon flattenArrayByChildren onu almak ve anahtar olarak kullanabilirsiniz.