Quiero reestructurar una matriz y algunas de las soluciones de stuckoverflow me ayudaron a hacerlo "adecuado" para los elementos de primer nivel, pero tú Notaré que la matriz tiene un nivel n profundo.Reestructurar matriz n-level con relación padre/hijo (PHP)
El método reestructurar() no se usa recursivamente (debería ser). Probablemente esté completamente equivocado y no tenga idea de cómo hacerlo bien.
El niños clave dice que hay niños con los respectivos identificadores, padres enlaces clave el artículo a la ID de padre.
class FilterMenu {
protected $tree = array();
static protected $structure = array();
public function __construct(array $tree)
{
$this->tree = $tree;
}
public function getStructure()
{
self::restructure($this->tree);
return self::$structure;
}
static public function restructure(array $structure)
{
foreach ($structure as $k => $v)
{
if (isset($v['parent']) and isset($v['children']) and count($v['children']) == 1)
{
// only 1 child
self::$structure[$k] = current(array_keys($v['children']));
}
elseif (isset($v['children']))
{
$keys = array_keys($v['children']);
self::$structure[$k] = array_combine($keys, $keys); // mirror array
//self::restructure($v['children']);
}
else
{
// no children
self::$structure[$k] = $k;
}
}
}
}
// test array
$tree = array(
1 => array(
'parent' => 1
),
2 => array(
'parent' => 2,
'children' => array(
3 => array(
'parent' => 2
),
6 => array(
'parent' => 2,
'children' => array(
10 => array(
'parent' => 6,
'children' => array(
4 => array(
'parent' => 10
)
)
)
),
),
),
),
7 => array(
'parent' => 7,
'children' => array(
11 => array(
'parent' => 7
)
)
),
14 => array(
'parent' => 14,
'children' => array(
15 => array(
'parent' => 14,
),
16 => array(
'parent' => 14,
),
19 => array(
'parent' => 14,
),
20 => array(
'parent' => 14,
),
21 => array(
'parent' => 14,
),
)
)
);
// test:
$tree = new FilterMenu($tree);
echo '<pre>'.print_r($tree->getStructure(), true);
resultado Actual:
Array
(
[1] => 1
[2] => Array
(
[3] => 3
[6] => 6
)
[7] => 11
[14] => Array
(
[15] => 15
[16] => 16
[19] => 19
[20] => 20
[21] => 21
)
)
el resultado deseado/esperado es:
Array
(
[1] => 1
[2] => Array
(
[3] => 3
[6] => Array
(
[10] => 4 // <-- array with n-levels...
)
)
[7] => 11
[14] => Array
(
[15] => 15
[16] => 16
[19] => 19
[20] => 20
[21] => 21
)
)
Aquí está el link to codepad que pone a prueba la clase y la matriz.
Cualquier ayuda es muy apreciada. Gracias.
Kudos a usted @Tomalak! Su solución hace exactamente lo que necesito en el resultado final, aunque la estructura es ligeramente diferente de lo que esperaba. Esta clase de ejemplo es una versión eliminada, pero la solución de "colapso" se adapta perfectamente ... tiene que descubrir cómo y por qué :) – verb8
@ verb8 Lo anterior hace lo correcto, su estructura esperada es incorrecta. Tenga en cuenta que esta solución modifica la matriz original. Si no quiere eso, debe adaptar la función. – Tomalak
Aquí está la función colgante como método de clase http://codepad.org/O3JV5rQe Cheers mate :) – verb8