php - sumar - Aplanar matrices multidimensionales concatenando claves
php manejo arrays (5)
Posible duplicado:
¿PHP convierte una matriz anidada en una única matriz mientras concatena claves?
Obtenga la clave de la matriz de forma recursiva y cree una cadena separada de subrayado
Por favor, lea la pregunta completa antes de responder.
Tengo esta matriz multidimensional:
$data = array(
''user'' => array(
''email'' => ''[email protected]'',
''name'' => ''Super User'',
''address'' => array(
''billing'' => ''Street 1'',
''delivery'' => ''Street 2''
)
),
''post'' => ''Hello, World!''
);
Lo quiero aplanado, transformado en:
$data = array(
''user.email'' => ''[email protected]'',
''user.name'' => ''Super User'',
''user.address.billing'' => ''Street 1'',
''user.address.delivery'' => ''Street 2'',
''post'' => ''Hello, World!''
);
Importante :
Las llaves son muy importantes para mí. Los quiero concatenados, separados por puntos.
Debería funcionar con cualquier nivel de anidación.
¡Gracias!
Algo como esto debería funcionar:
function flatten($array, $prefix = '''') {
$result = array();
foreach($array as $key=>$value) {
if(is_array($value)) {
$result = $result + flatten($value, $prefix . $key . ''.'');
}
else {
$result[$prefix . $key] = $value;
}
}
return $result;
}
Gracias por todas las respuestas dadas.
Lo he transformado en lo siguiente, que es una versión mejorada. Elimina la necesidad de un prefijo de raíz, no necesita usar referencias, es más fácil de leer y tiene un nombre mejor:
function array_flat($array, $prefix = '''')
{
$result = array();
foreach ($array as $key => $value)
{
$new_key = $prefix . (empty($prefix) ? '''' : ''.'') . $key;
if (is_array($value))
{
$result = array_merge($result, array_flat($value, $new_key));
}
else
{
$result[$new_key] = $value;
}
}
return $result;
}
Prueba esto
<?php
$data = array(
''user'' => array(
''email'' => ''[email protected]'',
''name'' => ''Super User'',
''address'' => array(
''billing'' => ''Street 1'',
''delivery'' => ''Street 2''
)
),
''post'' => ''Hello, World!''
);
function prefixKey($prefix, $array)
{
$result = array();
foreach ($array as $key => $value)
{
if (is_array($value))
$result = array_merge($result, prefixKey($prefix . $key . ''.'', $value));
else
$result[$prefix . $key] = $value;
}
return $result;
}
var_dump(prefixKey('''', $data));
?>
Salidas
array
''user.email'' => string ''[email protected]'' (length=16)
''user.name'' => string ''Super User'' (length=10)
''user.address.billing'' => string ''Street 1'' (length=8)
''user.address.delivery'' => string ''Street 2'' (length=8)
''post'' => string ''Hello, World!'' (length=13)
Utilice recursión como esta:
function process_data( $data, $parent_key ){
if ( ! is_array( $data ) ){
return $data;
}
$flattened_array = array();
foreach( $data as $key => $item ){
$flattened_key = $parent_key . ''.'' . $key;
$flattened_array[ $flattened_key ] = process_data( $item, $flattened_key );
}
return $flattened_array;
}
prueba esto here
Pasé por referencia por lo que no hay necesidad de devoluciones. simplemente entregar el almacenamiento de matriz.
$store = array();
function flatten($array,&$storage,$parentKey = ''''){
foreach($array as $key => $value){
$itemKey = (($parentKey)? $parentKey.''.'':'''').$key;
if(is_array($value)){
flatten($value,$storage,$itemKey);
} else {
$storage[$itemKey] = $value;
}
}
}
flatten($data,$store);
var_dump($store);