ordenar - sort array multidimensional php
Cadena con estructura de matriz a matriz (2)
Tengo una cuerda:
Main.Sub.SubOfSub
Y algún tipo de datos, puede ser una cadena:
SuperData
¿Cómo puedo transformarlo todo en esta matriz de arriba?
Array
(
[Main] => Array
(
[Sub] => Array
(
[SubOfSub] => SuperData
)
)
)
Gracias por ayuda, PK
Teniendo en cuenta los valores
$key = "Main.Sub.SubOfSub";
$target = array();
$value = "SuperData";
Aquí hay un código que tengo por ahí que hace lo que necesita¹:
$path = explode(''.'', $key);
$root = &$target;
while(count($path) > 1) {
$branch = array_shift($path);
if (!isset($root[$branch])) {
$root[$branch] = array();
}
$root = &$root[$branch];
}
$root[$path[0]] = $value;
¹ En realidad, es un poco más que eso: se puede encapsular de forma trivial dentro de una función y se puede configurar en los tres valores de entrada (puede pasar una matriz con valores existentes y la expandirá según sea necesario).
Como sugirió Jon (y al solicitar comentarios en el chat), un alias de referencia / variable es útil aquí para atravesar la pila dinámica de claves. Entonces, lo único que se necesita es iterar sobre todas las subclaves y finalmente establecer el valor:
$rv = &$target;
foreach(explode(''.'', $key) as $pk)
{
$rv = &$rv[$pk];
}
$rv = $value;
unset($rv);
La referencia hace posible usar una pila en lugar de recursión, que generalmente es más delgada. Además, este código evita sobrescribir elementos existentes en la matriz $target
. Ejemplo completo:
$key = "Main.Sub.SubOfSub";
$target = array(''Main'' => array(''Sub2'' => ''Test''));
$value = "SuperData";
$rv = &$target;
foreach(explode(''.'', $key) as $pk)
{
$rv = &$rv[$pk];
}
$rv = $value;
unset($rv);
var_dump($target);
Salida:
array(1) {
["Main"]=>
array(2) {
["Sub2"]=>
string(4) "Test"
["Sub"]=>
array(1) {
["SubOfSub"]=>
string(9) "SuperData"
}
}
}
Preguntas relacionadas):
- adiciones de teclas de matriz dinámica
- ¿Cómo agrupar elementos de la matriz?