多维数组到单个数组


Multi-dimensional array in to single array

有没有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 演示

编辑:

添加了递归调用:通过这种方式,您甚至可以扁平化多嵌套数组