sort ordenar multidimensional asociativo array php arrays string algorithm multidimensional-array

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;

Véalo en acción .

¹ 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" } } }

Manifestación

Preguntas relacionadas):

  • adiciones de teclas de matriz dinámica
  • ¿Cómo agrupar elementos de la matriz?