Just wondering if anyone has transformed a 2 dim array to a one dim array in php. I\'ve yet to come across a clear explanation in php. Any suggestion would be appreciated.
This might be helpful to you if you fetching values from Query here you can use array function which will support in PHP 5.5+
$myfield_arr = array_column($query_result, 'myfield_name');
Say Good bye to loop! Enjoy Smart Code.
you mean like this?
$array = array(array('green', 'yellow', 'orange'), array('blue', 'black', 'white'));
$newarray = array();
foreach (array_values($array) as $value){
$newarray[] = $value;
}
Try this one:
function array_to1d($a) {
$out = array();
foreach ($a as $b) {
foreach ($b as $c) {
if (isset($c)) {
$out[] = $c;
}
}
}
return $out;
}
Notice that it includes a test to see if the value is set (non-null). An array that's a transposition of an array with rows of varying length will have null values in some cells, and this check can be helpful if you're trying to linearize such a beast.
After PHP 5.3 there have a new function called arrray_walk_recursive
$data = [1,2,[3,4],5,[6,7,8],9];
$output = [];
array_walk_recursive($data, function($val) use (&$output) {
$output[] = $val;
});
Notice that the $output
is passed by reference
The $output
will result in [1,2,3,4,5,6,7,8,9]
Your first thought should be array_reduce()
whenever you have lots of something in an array and you just want one something by itself which represents them all in some way.
From the PHP docs:
array_reduce — Iteratively reduce the array to a single value using a callback function
In the case of 2D => 1D array conversion, the something is array; we have lots of them in an array but we just want one of them by itself.
function array2dTo1d($array2d)
{
return array_reduce($array2d, function($carry, $array) {
return array_merge($carry, $array);
}, []);
}
var_dump(array2dTo1d(
[
[23423, 5454, 567],
[4565, 687],
]
));
Result:
array(5) {
[0] =>
int(23423)
[1] =>
int(5454)
[2] =>
int(567)
[3] =>
int(4565)
[4] =>
int(687)
}
The solution for rectangular 2D array is simple indeed, but I had a problem. My 2D-array consisted of 1D arrays of different lengths :
$myArray = [
[1, 2, 3, 4],
[5, 6, 7],
[8, 9]
];
I came up with more generalized solution to turn any 2D array into 1D:
function array2DTo1D($arr2D) {
$i = 0; $j = 0;
$arr1D = [];
while (isset($arr2D[$i][0])) {
while (isset($arr2D[$i][$j])) {
$arr1D[] = $arr2D[$i][$j];
$j++;
}
$i++; $j = 0;
}
return $arr1D;
}