una matriz manejo imprimir hacer ejemplos datos como asociativo array 3x3 php arrays recursion tree tree-traversal

manejo - Función de desplazamiento de PHP para convertir una matriz única en matriz anidada con elementos secundarios, en función de la id. Principal



manejo de array en php (2)

Tengo una matriz similar a esto:

Array ( Array ( [ID] => 1 [parentcat_ID] => 0 ), Array ( [ID] => 2 [parentcat_ID] => 0 ), Array ( [ID] => 6 [parentcat_ID] => 1 ), Array ( [ID] => 7 [parentcat_ID] => 1 ), Array ( [ID] => 8 [parentcat_ID] => 6 ), Array ( [ID] => 9 [parentcat_ID] => 1 ), Array ( [ID] => 13 [parentcat_ID] => 7 ), Array ( [ID] => 14 [parentcat_ID] => 8 ) )

Pero necesito una función para colocar recursivamente cada elemento en una matriz ''secundarios'' dentro de la matriz principal relevante. Entonces se vería más como esto:

Array ( Array ( [ID] => 1 [parentcat_ID] => 0 [children] => Array ( Array ( [ID] => 6 [parentcat_ID] => 1 [childen] => Array ( Array ( [ID] => 8 [parentcat_ID] => 6 [children] => Array ( Array ( [ID] => 14 [parentcat_ID] => 8 ) ) ) ) ), Array ( [ID] => 7 [parentcat_ID] => 1 [children] => Array( Array ( [ID] => 13 [parentcat_ID] => 7 ) ) ), Array ( [ID] => 9 [parentcat_ID] => 1 ) ) ) Array ( [ID] => 2 [parentcat_ID] => 0 ) )

¡Espero que tenga sentido!


Dale una oportunidad (probado en php 5.2):

$inArray = array( array(''ID'' => ''1'', ''parentcat_ID'' => ''0''), array(''ID'' => ''2'', ''parentcat_ID'' => ''0''), array(''ID'' => ''6'', ''parentcat_ID'' => ''1''), array(''ID'' => ''7'', ''parentcat_ID'' => ''1''), array(''ID'' => ''8'', ''parentcat_ID'' => ''6''), array(''ID'' => ''9'', ''parentcat_ID'' => ''1''), array(''ID'' => ''13'', ''parentcat_ID'' => ''7''), array(''ID'' => ''14'', ''parentcat_ID'' => ''8''), ); function makeParentChildRelations(&$inArray, &$outArray, $currentParentId = 0) { if(!is_array($inArray)) { return; } if(!is_array($outArray)) { return; } foreach($inArray as $key => $tuple) { if($tuple[''parentcat_ID''] == $currentParentId) { $tuple[''children''] = array(); makeParentChildRelations($inArray, $tuple[''children''], $tuple[''ID'']); $outArray[] = $tuple; } } } $outArray = array(); makeParentChildRelations($inArray, $outArray); print_r($outArray);


Recientemente respondí una pregunta similar. Aquí está. Espero que se adapte a tus necesidades. Si no, avíseme y lo ajustaré a sus especificaciones.

EDITAR
Bien, aquí está la versión ajustada que debería adaptarse a tus necesidades.

function generateMultiArray( array $flatArray ) { // initiate result array $multiArray = array(); // iterate $flatArray foreach( $flatArray as $item ) { // for convenience, initiate these vars $id = $item[ ''ID'' ]; $parentId = $item[ ''parentcat_ID'' ]; // initiate this item''s children array; $item[ ''children'' ] = array(); // if parent doesn''t exist yet, initiate it along with an empty ''children'' array if( !isset( $multiArray[ $parentId ] ) ) { $multiArray[ $parentId ] = array( ''children'' => array() ); } // if this item is initiated already (as being a parent) merge it with the current item $multiArray[ $id ] = isset( $multiArray[ $id ] ) ? $multiArray[ $id ] + $item : $item; // add this item to the parents children collection by reference (for efficiency) $multiArray[ $parentId ][ ''children'' ][ $id ] = &$multiArray[ $id ]; } return $multiArray; }

Tenga en cuenta que esta función también hace que todos los elementos sean accesibles como un elemento raíz de la matriz de resultados con su ID como índice.

Por lo tanto, para acceder a los niños de un elemento con identificador arbitrario n, harías:

$multiArray = generateMultiArray( $yourFlatArray ); $children = $multiArray[ n ][ ''children'' ]; // replace n with the id

EDIT 2
Se olvidó de iniciar una matriz para niños para elementos que no son padres; agregado ahora De lo contrario, se generaría un aviso al intentar acceder a él con:

$multiArray = generateMultiArray( $yourFlatArray ); $children = $multiArray[ $someIdWithoutChildren ][ ''children'' ];