有没有办法用键压平多维(最多 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"
]
您可以为此编写一个递归函数:
$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));
扩展示例输入数据以包括包含非数组类型数据的关联元素,如果它们是非整数,则捕获键可能变得很重要。这是一个递归函数,适用于原始问题数据和此扩展要求。
在
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',
)