PHP: classificar uma matriz

Eu tenho uma matriz com dados de uma tabela MySQL em um modelo de conjunto nested. Eu gostaria de ser ordenado, não apenas alfabético, mas também com os nós filhos diretamente após o nó pai. Exemplo – matriz a ser ordenada (antes da 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 ) ) 

Eu quero a matriz dessa maneira (após a sorting):

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

Como você pode ver, eu quero todas as postagens com o pai 2 diretamente após a postagem com id 2, e assim por diante.

Qualquer ajuda será muito apreciada. Agradeço antecipadamente.

Não faça isso em PHP!

O servidor MySQL é projetado especificamente para consultar e classificar dados, ler na syntax ” ORDER BY ” do MySQL. Fazer isso no servidor MySQL economizará tempo de execução, carga da CPU e consumo de memory.

Use a function uasort() do php para definir sua própria function de comparação.

Mas usar as capacidades de sorting do MySQL seria mais apropriado, se for possível no seu caso.

Você deseja classificá-lo como se estivesse no database, em várias camadas. Eu não acho que o uasort pode ajudar com esse problema porque você deseja append as crianças ao pai.

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

Se você deseja salvar a chave, você pode apenas adicionar isso ao $ val no primeiro parágrafo e recuperá-lo na function recursiva, arrasarArrayByChildren e usar como chave.

Problema resolvido – fiz duas funções simples. Espero que outras pessoas também possam usar isso:

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

Obrigado pelo seu tempo. Todas as melhorias são mais do que bem-vindas.

Intereting Posts