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
)

$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;
});

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

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

см.wiki.php.net по распаковке