2012-08-31 12 views
10

¿Cómo puedo ordenar una matriz con todos los niños después de sus respectivos padres? Supongo que estoy tratando de almacenar un árbol dentro de una matriz unidimensional. He tratado de resolver esto usando el uso de la red, pero no creo que sea la herramienta adecuada para el trabajo.orden de matriz según el padre; un árbol en una matriz unidimensional

Ejemplo matriz de entrada:

array (0 => array ('id' => '1', 'parent' => '0',), 
1 => array ('id' => '2', 'parent' => '1',), 
2 => array ('id' => '3', 'parent' => '0',), 
3 => array ('id' => '5', 'parent' => '0',), 
4 => array ('id' => '17', 'parent' => '3',), 
5 => array ('id' => '31', 'parent' => '2',), 
6 => array ('id' => '32', 'parent' => '2',)) 

salida Ejemplo:

Array sorted according to the description

+0

¿Cuántos niveles se esta matriz tiene? –

+2

no estoy entendiendo lo que estás preguntando. ¿Qué es exactamente lo que estamos tratando de lograr aquí? unir el número padre a la identificación? – Mic1780

Respuesta

6

de inicio mediante la construcción de un árbol real, entonces aplanar ese árbol:

$array = array (0 => array ('id' => '1', 'parent' => '0',), 
       1 => array ('id' => '2', 'parent' => '1',), 
       2 => array ('id' => '3', 'parent' => '0',), 
       3 => array ('id' => '5', 'parent' => '0',), 
       4 => array ('id' => '17', 'parent' => '3',), 
       5 => array ('id' => '31', 'parent' => '2',), 
       6 => array ('id' => '32', 'parent' => '2',)); 

/* Building a tree. We also save a map of references to avoid         
    searching the tree for nodes */ 

//Helper to create nodes                  
$tree_node = function($id, $parent) { 
    return array('id' => $id, 'parent' => $parent, 'children' => array()); 
}; 

$tree = $tree_node(0, null); //root node              
$map = array(0 => &$tree); 
foreach($array as $cur) { 
    $id = (int) $cur['id']; 
    $parentId = (int) $cur['parent']; 
    $map[$id] =& $map[$parentId]['children'][]; 
    $map[$id] = $tree_node($id, $parentId); 
} 

//Now recursively flatten the tree:               
function flatter($node) { 
    //Create an array element of the node            
    $array_element = array('id' => (string) $node['id'], 
         'parent' => (string) $node['parent']); 
    //Add all children after me                 
    $result = array($array_element); 
    foreach($node['children'] as $child) { 
    $result = array_merge($result, flatter($child)); 
    } 
    return $result; 
} 

$array = flatter($tree); 
array_shift($array); //Remove the root node, which was only added as a helper     

print_r($array); 
+0

Hola, Emil Vikström. ¡Todo bien! ¡Gracias! –

-1
<?php 

/** 
* @author Prasath A.R 
* @copyright 2012 
* @Date 2012-8-31 17:14 
*/ 

$array = array (0 => array ('id' => '1', 'parent' => '0',), 
       1 => array ('id' => '2', 'parent' => '1',), 
       2 => array ('id' => '3', 'parent' => '0',), 
       3 => array ('id' => '5', 'parent' => '0',), 
       4 => array ('id' => '17', 'parent' => '3',), 
       5 => array ('id' => '31', 'parent' => '2',), 
       6 => array ('id' => '32', 'parent' => '2',)); 

print_r($array); 
echo "<br />"; 

for($i=0;$i<count($array);$i++) 
{ 
for($j=$i;$j<count($array);$j++) 
{ 
     if($array[$i]['parent']>$array[$j]['parent']) 
     { 
      $temp=$array[$i]; 
      $array[$i]=$array[$j]; 
      $array[$j]=$temp; 
     } 
    } 
} 

echo "<h2>After Sorting</h2><br />"; 
print_r($array); 

?> 

La respuesta será:

matriz ( [0] => Array ( [id] => 1 [parent] => 0 )

[1] => Array 
    (
     [id] => 2 
     [parent] => 1 
    ) 

[2] => Array 
    (
     [id] => 3 
     [parent] => 0 
    ) 

[3] => Array 
    (
     [id] => 5 
     [parent] => 0 
    ) 

[4] => Array 
    (
     [id] => 17 
     [parent] => 3 
    ) 

[5] => Array 
    (
     [id] => 31 
     [parent] => 2 
    ) 

[6] => Array 
    (
     [id] => 32 
     [parent] => 2 
    ) 

)

Después de ordenar

Matriz ( [0] => Matriz ( [id] => 1 [padre] => 0 )

[1] => Array 
    (
     [id] => 3 
     [parent] => 0 
    ) 

[2] => Array 
    (
     [id] => 5 
     [parent] => 0 
    ) 

[3] => Array 
    (
     [id] => 2 
     [parent] => 1 
    ) 

[4] => Array 
    (
     [id] => 31 
     [parent] => 2 
    ) 

[5] => Array 
    (
     [id] => 32 
     [parent] => 2 
    ) 

[6] => Array 
    (
     [id] => 17 
     [parent] => 3 
    ) 

)

+0

Esto no coincide con la pregunta. Su matriz de resultados no es igual a la de la pregunta. –

+0

@Emil Vikström: En realidad, los resultados coinciden, tenemos que cambiar la matriz de 0 teclas para el último elemento de la matriz –

Cuestiones relacionadas