从可变深度/结构的多维数组中获取所有值和关联键作为平面数组

问题描述 投票:0回答:2

有没有办法用键压平多维(最多 1 到 3 层)?

我有一个这样的数组

array(
    'Orange',
    'Grape',
    'Banana' => array(
        'Big',
        'Small'
    ),
    'Apple' => array(
        'Red',
        'Green' => array(
            'Soft',
            'Hard'
        )
    )
);

我希望它是这样的

array(
    'Orange',
    'Grape',
    'Banana',
    'Big',
    'Small',
    'Apple',
    'Red',
    'Green',
    'Soft',
    'Hard'
);

因此它将保持出现的顺序,以便最近使用

array_keys
获取索引。

我尝试了几种方法,但如果数组元素是新数组的键,它不会被展平,只是跳过,所以我的最终数组看起来像这样

array:7 [▼
  0 => "Orange"
  1 => "Grape"
  2 => "Big"
  3 => "Small"
  4 => "Red"
  5 => "Soft"
  6 => "Hard"
]
php arrays recursion multidimensional-array
2个回答
5
投票

您可以为此编写一个递归函数:

$nested = array(
    'Orange',
    'Grape',
    'Banana' => array(
        'Big',
        'Small'
    ),
    'Apple' => array(
        'Red',
        'Green' => array(
            'Soft',
            'Hard'
        )
    )
);

function flattern($array)
{
    $flat=[];
    foreach($array as $key=>$val){
        if(is_array($val)){
            $flat[]=$key;
            $flat = array_merge($flat, flattern($val));
        }else{
            $flat[]=$val;
        }
    }
    return $flat;
}

var_dump(flattern($nested));

0
投票

扩展示例输入数据以包括包含非数组类型数据的关联元素,如果它们是非整数,则捕获键可能变得很重要。这是一个递归函数,适用于原始问题数据和此扩展要求。

array_push()
内部散布索引数组提供了真正的便利。如果展开一个空数组,则不会推送任何元素。通过在
array_push()
内部展开数组,就不再需要
array_merge()

代码:(演示)

$array = [
    'Orange',
    'Grape',
    'Banana' => [
        'Big',
        'Small'
    ],
    'Apple' => [
        'Red',
        'Green' => [
            'Soft',
            'Hard'
        ]
    ],
    'foo' => [
        [
            [
                'bar0' => 'nun',
                'bar1' => 'won',
                'bar2' => 'too',
            ]
        ]
    ]
];

function flatten(array $array): array
{
    $result = [];
    foreach ($array as $k => $v) {
        array_push(
            $result,
            ...(is_int($k) ? [] : [$k]),
            ...(is_array($v) ? flatten($v) : [$v])
        );
    }
    return $result;
}

var_export(flatten($array));

结果:

array (
  0 => 'Orange',
  1 => 'Grape',
  2 => 'Banana',
  3 => 'Big',
  4 => 'Small',
  5 => 'Apple',
  6 => 'Red',
  7 => 'Green',
  8 => 'Soft',
  9 => 'Hard',
  10 => 'foo',
  11 => 'bar0',
  12 => 'nun',
  13 => 'bar1',
  14 => 'won',
  15 => 'bar2',
  16 => 'too',
)
© www.soinside.com 2019 - 2024. All rights reserved.