PHP: превращение многомерных массивов в одномерные массивы
в основном мое приложение взаимодействует с веб-службой, которая отправляет обратно странный многомерный массив, такой как:
Array
(
[0] => Array
(
[Price] => 1
)
[1] => Array
(
[Size] => 7
)
[2] => Array
(
[Type] => 2
)
)
это не проблема, но проблема в том, что сервис продолжает изменять индекс этих элементов, поэтому в следующем массиве цена может быть на 1 вместо 0.
Как эффективно преобразовать массивы, подобные этому, в массив одного измерения, чтобы я мог получить доступ к переменным через $var ['Size'] вместо $var[1] ['Size']?
ценю вашу помощь
7 ответов
такой:
$result = array();
foreach($array as $inner) {
$result[key($inner)] = current($inner);
}
на $result
массив теперь будет выглядеть так:
Array
(
[Price] => 1
[Size] => 7
[Type] => 2
)
Я использую помощника laravel:http://laravel.com/api/source-function-array_flatten.html#179-192
function array_flatten($array)
{
$return = array();
array_walk_recursive($array, function($x) use (&$return) { $return[] = $x; });
return $return;
}
function flattenArray($input, $maxdepth = NULL, $depth = 0)
{
if(!is_array($input)){
return $input;
}
$depth++;
$array = array();
foreach($input as $key=>$value){
if(($depth <= $maxdepth or is_null($maxdepth)) && is_array($value)){
$array = array_merge($array, flattenArray($value, $maxdepth, $depth));
} else {
array_push($array, $value);
// or $array[$key] = $value;
}
}
return $array;
}
рассмотрим $mArray как многомерный массив и $sArray как одномерный массив этот код будет игнорировать Родительский массив
function flatten_array($mArray) {
$sArray = array();
foreach ($mArray as $row) {
if ( !(is_array($row)) ) {
if($sArray[] = $row){
}
} else {
$sArray = array_merge($sArray,flatten_array($row));
}
}
return $sArray;
}
Я думаю, что я нашел лучшее решение для этого :
array_walk_recursive($yourOLDmultidimarray, function ($item, $key) {
//echo "$key holds $item\n";
$yourNEWarray[]=$item;
});
Если вы используете php >= 5.6, вы можете использовать распаковку массива (это намного быстрее):
$result = array_merge(...$array);