Сглаживание многомерных массивов, объединяющих ключи

Возможный дубликат:
PHP конвертирует вложенный массив в единый массив при конкатенации ключей?
Получить рекурсивный массив массива и создать выделенную строку подчеркивания

Пожалуйста, прочитайте весь вопрос, прежде чем отвечать.

У меня этот многомерный массив:

$data = array( 'user' => array( 'email' => 'user@example.com', 'name' => 'Super User', 'address' => array( 'billing' => 'Street 1', 'delivery' => 'Street 2' ) ), 'post' => 'Hello, World!' ); 

Я хочу, чтобы он сглаживался, превращался в:

 $data = array( 'user.email' => 'user@example.com', 'user.name' => 'Super User', 'user.address.billing' => 'Street 1', 'user.address.delivery' => 'Street 2', 'post' => 'Hello, World!' ); 

Важно :

  • Ключи очень важны для меня. Я хочу, чтобы они были объединены, разделенные периодами.

  • Он должен работать с любым уровнем гнездования.

Спасибо!

Что-то вроде этого должно работать:

 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; } 

DEMO

Спасибо за все ответы.

Я преобразовал его в следующее, что является улучшенной версией. Это устраняет необходимость корневого префикса, не требует использования ссылок, чище читать и имеет лучшее имя:

 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; } 

Попробуй это

 <?php $data = array( 'user' => array( 'email' => 'user@example.com', '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)); ?> 

Выходы

 array 'user.email' => string 'user@example.com' (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) 

Используйте рекурсию, такую ​​как:

 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; } 

испытайте это здесь

я прошел по ссылке, поэтому нет необходимости возвращать. просто передайте хранилище массивов.

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