有没有PHP数组函数来压缩下面的数组结构;
array:2 [▼
0 => array:2 [▼
0 => {#90 ▶}
1 => {#91 ▶}
]
1 => array:5 [▼
0 => {#92 ▶}
1 => {#93 ▶}
2 => {#94 ▶}
3 => {#95 ▶}
4 => {#96 ▶}
]
]
在这样的事情中;
array:7 [▼
0 => {#90 ▶}
1 => {#91 ▶}
3 => {#92 ▶}
4 => {#93 ▶}
5 => {#94 ▶}
6 => {#95 ▶}
7 => {#96 ▶}
]
]
抱歉,这是一个使用 Laravel 的dd
(死亡和转储(,但我认为你对我想要实现的目标有了大致的了解。
另请注意,这可能并不总是传入数据的结构。有时它只是一个单维数组。所以这会导致错误;
$domain->questions = call_user_func_array('array_merge', $domain->questions);
这似乎有效,但只有在数组深度为 2 级时才能达到目的。幸运的是,这就是我现在所需要的;
if(is_array($questions[0])) {
$questions = call_user_func_array('array_merge', $questions);
}
以下是一维和二维数组的解决方案:
<?php
$input = array(
array(
0 => '#90',
1 => '#91',
),
array(
0 => '#92',
1 => '#93',
2 => '#94',
3 => '#95',
4 => '#96',
)
);
$newarray = array();
foreach($input as $items) {
if (is_array($items)) foreach ($items as $item) {
$newarray[] = $item;
} else {
$newarray[] = $items;
}
}
echo '<pre>'; print_r($newarray); echo '</pre>';
下面是具有混合数组(数组数组和项目数组(的相同逻辑:
<?php
$input = array(
0 => '#90',
array(
0 => '#91',
1 => '#92',
),
4 => '#93',
5 => '#94',
6 => '#95',
7 => '#96',
);
$newarray = array();
foreach($input as $items) {
if (is_array($items)) foreach ($items as $item) {
$newarray[] = $item;
} else {
$newarray[] = $items;
}
}
echo '<pre>'; print_r($newarray); echo '</pre>';
因此,无论输入数组是一维、二维还是混合数组,foreach 逻辑都是可用的。
在这两种情况下,结果都将是:
Array
( [0] => #90
[1] => #91
[2] => #92
[3] => #93
[4] => #94
[5] => #95
[6] => #96
)
因为您不知道数组是否包含子项,所以您可以尝试如下操作:
function flatten($array) {
// If this is already an empty array or a flat array, just return it
if (empty($array) || ! is_array($array[0])) {
return $array;
}
// just merge all sub-arrays into a single array
$flat = [];
foreach ($array as $item) {
$flat = array_merge($flat, $item)
}
return $flat;
}
另一个速度较慢(但对不同格式更具弹性(的选项是:
function flatten($array) {
// If this is already an empty array just return it
if (empty($array)) {
return $array;
}
// just add all sub-items into a single array
$flat = [];
foreach ($array as $item) {
if (is_array($item)) {
$flat = array_merge($flat, flatten($item));
} else {
$flat[] = $item;
}
}
return $flat;
}
这将对数组进行"深度"扁平化,但正如我所说 - 会更慢
我认为这可以满足您的需求
<?php
$tester = [
['90', '91'],
['92', '93', '94', '95', '96']
];
$tester2 = array_merge($tester[0], $tester[1]);
print_r($tester);
print_r($tester2);
生成以下输出:
Array
(
[0] => Array
(
[0] => 90
[1] => 91
)
[1] => Array
(
[0] => 92
[1] => 93
[2] => 94
[3] => 95
[4] => 96
)
)
Array
(
[0] => 90
[1] => 91
[2] => 92
[3] => 93
[4] => 94
[5] => 95
[6] => 96
)
试试这个简单的函数:
function flatArray($array)
{
$retval = array();
foreach ($array as $val) {
if (is_array($val))
$retval = array_merge($retval, flatArray($val));
else
$retval[] = $val;
}
return $retval;
}
然后:
$array1 = [['#90', '#91'], ['#92', '#93', '#94', '#95', '#96']];
$array2 = ['#82', '#83', '#84', '#85', '#86'];
$array3 = [['#90', '#91', ['100', '101']], ['#92', '#93', '#94', '#95', '#96']];
print_r(flatArray($array1));
print_r(flatArray($array2));
print_r(flatArray($array3));
将输出:
Array
(
[0] => #90
[1] => #91
[2] => #92
[3] => #93
[4] => #94
[5] => #95
[6] => #96
)
和
Array
(
[0] => #82
[1] => #83
[2] => #84
[3] => #85
[4] => #86
)
和 - 对于阵列 3(三个级别(:
Array
(
[0] => #90
[1] => #91
[2] => 100
[3] => 101
[4] => #92
[5] => #93
[6] => #94
[7] => #95
[8] => #96
)
3v4l.org 演示
编辑:
添加了递归调用:通过这种方式,您甚至可以扁平化多嵌套数组