values create assoc array php arrays tree

create - php array assoc



Convierte 2d array en 3d con PHP (2)

<?php $p = array(0 => array()); foreach($nodes as $n) { $pid = $n[''pid'']; $id = $n[''id'']; if (!isset($p[$pid])) $p[$pid] = array(''child'' => array()); if (isset($p[$id])) $child = &$p[$id][''child'']; else $child = array(); $p[$id] = $n; $p[$id][''child''] = &$child; unset($p[$id][''pid'']); unset($p[$id][''level'']); unset($child); $p[$pid][''child''][] = &$p[$id]; // $p[$pid][''child''] = &$p[$id]; // or this, if only one child } $nodes = $p[''0''][''child'']; unset($p); ?>

Si cada nodo solo puede tener un hijo, entonces reemplace la línea con $p[$pid][''child''] = &$p[$id]; .

(Editar: lo arregló para que funcione, independientemente de cómo se clasifiquen los nodos).

Hay una matriz 2d simple con algún tipo de árbol como este:

  • nodo1
    • nodo2
      • nodo3

Su estructura es:

array( array ( ''id'' : 1, ''pid'': 0, ''title'' : ''node1'', ''level'' : 1 ), array ( ''id'' : 2, ''pid'': 1, ''title'' : ''node2'', ''level'' : 2 ), array ( ''id'' : 3, ''pid'': 2, ''title'' : ''node3'', ''level'' : 3 ), )

¿Hay soluciones con PHP para convertir esta matriz en:

array( array ( ''id'' : 1, ''title'' : ''node1'', ''child'' : array ( ''id'' : 2, ''title'' : ''node2'', ''child'' : array ( ''id'' : 3, ''title'' : ''node3'', ), ), ) ... )


Se encontró la función @SO PHP Traversing para convertir una única matriz en una matriz anidada con elementos secundarios , en función de la ID padre

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