Last active
October 28, 2024 18:01
-
-
Save SeanCannon/6585889 to your computer and use it in GitHub Desktop.
PHP array_flatten() function. Convert a multi-dimensional array into a single-dimensional array.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Convert a multi-dimensional array into a single-dimensional array. | |
* @author Sean Cannon, LitmusBox.com | [email protected] | |
* @param array $array The multi-dimensional array. | |
* @return array | |
*/ | |
function array_flatten($array) { | |
if (!is_array($array)) { | |
return false; | |
} | |
$result = array(); | |
foreach ($array as $key => $value) { | |
if (is_array($value)) { | |
$result = array_merge($result, array_flatten($value)); | |
} else { | |
$result = array_merge($result, array($key => $value)); | |
} | |
} | |
return $result; | |
} |
@brandonmcconnell Using my sample data it gives not what I expected.
By the way, how to use it with unlimited $depth? array_flatten($r, 999)
doesn't look good for me
Despite of that your function does the job of flattening, no doubt :) maybe flatten is not the right word because of ambiguity?
@sayhicoelho thanks for 7.x support!
echo json_encode(array_flatten($r, 9));
{
"a": "value1",
"c": "value1.1",
"d": "value1.2",
"e": "value2",
"k": "value2.1",
"m": "value2.2",
"n": "value2.3",
"o": "value3",
"0": "first",
"1": "second",
"q": "value5"
}
@graceman9 What data produces an unexpected result?
For infinite depth, just use -1
@brandonmcconnell Have you noticed the difference?
{
"a": "value1",
"b_c": "value1.1",
}
and
{
"a": "value1",
"c": "value1.1",
}
@graceman9 Oh you want the keys to be concatenated, so every key keeps the log of its original path. Yeah, you are correct that my version does not do that. I tried to follow the approach common in other languages. 🙂
For a simple 2D array:
$multiDimArray = [[1, 2], [3, 4], [5, 6]];
$flatArray = array_reduce($multiDimArray, 'array_merge', []);
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@sayhicoelho Have you tried my approach above? It should work with associative and non-associative arrays, and be compatible with PHP 7+.
It also supports a depth parameter, so you can easily flatten only the top layer, the first N layers, or infinitely.