Skip to content

Instantly share code, notes, and snippets.

@kevinfiol
Last active March 30, 2018 14:23
Show Gist options
  • Save kevinfiol/941b9a3c0df52984b362b42fbc6d642c to your computer and use it in GitHub Desktop.
Save kevinfiol/941b9a3c0df52984b362b42fbc6d642c to your computer and use it in GitHub Desktop.
Flatten Multi-Dimensional PHP Arrays
<?php
function flatten($arr, $keys = []) {
$res = [];
foreach ($arr as $key => $val) {
$keys[] = strval($key);
if (is_array($val)) {
$res = array_merge($res, flatten($val, $keys));
} else {
$res['_' . implode('.', $keys)] = $val;
}
array_pop($keys);
}
return $res;
}
@kevinfiol
Copy link
Author

kevinfiol commented Mar 29, 2018

Sample Input:

$states = [
	'Alabama' => [
		'name' => 'Alabama',
		'abrev' => 'AL',
		'details' => [
			'population' => 800,
			'country' => 'USA'
		]
	],
	'Florida' => [
		'name' => 'Florida',
		'abrev' => 'FL',
		'details' => [
			'population' => 212,
			'country' => 'USA'
		]
	],
	'New York' => [
		'name' => 'New York',
		'abrev' => 'NY',
		'details' => [
			'population' => 998,
			'country' => 'USA'
		]
	],
	'Illinois' => [
		'name' => 'Illinois',
		'abrev' => 'IL',
		'details' => [
			'population' => 111,
			'country' => 'USA'
		]
	],
	'Colorado' => [
		'name' => 'Colorado',
		'abrev' => 'CO',
		'details' => [
			'population' => 841,
			'country' => 'USA'
		]
	],

	// Numerical Indexes
	52 => [
		'randomdetails' => [
			'stuff' => 5432
		],
		'deeply' => [
			'nested' => [
				'arrays' => [
					'are' => [
						'awesome' => 'one',
						'cool' => 'two',
						'sweet' => 'three',
						'sick' => 'four',
						'rad' => 'five',
						800 => 'number'
					]
				]
			]
		]
	]
];

print_r(flatten($states));

Sample Output:

Array
(
    [_Alabama.name] => Alabama
    [_Alabama.abrev] => AL
    [_Alabama.details.population] => 800
    [_Alabama.details.country] => USA
    [_Florida.name] => Florida
    [_Florida.abrev] => FL
    [_Florida.details.population] => 212
    [_Florida.details.country] => USA
    [_New York.name] => New York
    [_New York.abrev] => NY
    [_New York.details.population] => 998
    [_New York.details.country] => USA
    [_Illinois.name] => Illinois
    [_Illinois.abrev] => IL
    [_Illinois.details.population] => 111
    [_Illinois.details.country] => USA
    [_Colorado.name] => Colorado
    [_Colorado.abrev] => CO
    [_Colorado.details.population] => 841
    [_Colorado.details.country] => USA
    [_52.randomdetails.stuff] => 5432
    [_52.deeply.nested.arrays.are.awesome] => one
    [_52.deeply.nested.arrays.are.cool] => two
    [_52.deeply.nested.arrays.are.sweet] => three
    [_52.deeply.nested.arrays.are.sick] => four
    [_52.deeply.nested.arrays.are.rad] => five
    [_52.deeply.nested.arrays.are.800] => number
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment