PHP: превращение многомерных массивов в одномерные массивы

В основном мое приложение взаимодействует с веб-службой, которая отправляет обратно странный многомерный массив, такой как:

Array ( [0] => Array ( [Price] => 1 ) [1] => Array ( [Size] => 7 ) [2] => Array ( [Type] => 2 ) ) 

Это не проблема, но проблема в том, что служба продолжает изменять индекс этих элементов, поэтому в следующем массиве цена может быть равна 1 вместо 0.

Как эффективно преобразовывать массивы, подобные этому, в один размерный массив, чтобы я мог обращаться к переменным через $ var ['Size'] вместо $ var [1] ['Size']?

Ценю вашу помощь

Как это:

 $result = array(); foreach($array as $inner) { $result[key($inner)] = current($inner); } 

Теперь массив $result выглядит следующим образом:

 Array ( [Price] => 1 [Size] => 7 [Type] => 2 ) 
 $result = call_user_func_array('array_merge', $array); 

Я использую помощника 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; });
array_walk_recursive($yourOLDmultidimarray, function ($item, $key) { //echo "$key holds $item\n"; $yourNEWarray[]=$item; }); 

Если вы используете php> = 5.6, вы можете использовать распаковку массивов (это намного быстрее):

 $result = array_merge(...$array); 

См. Wiki.php.net при распаковке