【问题标题】:Possible easier way to split nested arrays拆分嵌套数组的可能更简单的方法
【发布时间】:2017-07-18 20:52:28
【问题描述】:

我有一个数组数组。每个嵌套数组包含两个逗号分隔值的成员。我想做的是将这些嵌套数组分解成多个数组。

例如,如果我有以下数组...

Array
(
    [0] => Array
        (
            [a] => 'single value',
            [b] => '1,2',
            [c] => 'left, right'
    ],

    [1] => Array
        (
            [a] => 'single value',
            [b] => '4,5',
            [c] => 'top, middle'
        )
)

...我最终希望得到以下结果。

Array
(
    [0] => Array
        (
            [a] => 'single value',
            [b] => '1',
            [c] => 'left'
        )

    [1] => Array
        (
            [a] => 'single value',
            [b] => '1',
            [c] => 'right'
        )

    [2] => Array
        (
            [a] => 'single value',
            [b] => '2',
            [c] => 'left'
        )

    [3] => Array
        (
            [a] => 'single value',
            [b] => '2',
            [c] => 'right'
        )

    [4] => Array
        (
            [a] => 'single value',
            [b] => '4',
            [c] => 'top'
        )

    [5] => Array
        (
            [a] => 'single value',
            [b] => '4',
            [c] => 'bottom'
        )

    [6] => Array
        (
            [a] => 'single value',
            [b] => '5',
            [c] => 'top'
        )

    [7] => Array
        (
            [a] => 'single value',
            [b] => '5',
            [c] => 'bottom'
        )
)

我可以通过一系列嵌套的 foreach 循环来实现这一点,但这似乎效率很低 - 特别是考虑到某些 b 和 c 值可以包含许多元素的事实。

$new_array = [];
foreach($array as $a)
{
    foreach(explode(',', $a['b']) as $b)
    {
        foreach(explode(',', $a['c']) as $c)
        {
            $d = [
                'a' => $a['a'],
                'b' => $b,
                   'c' => $c
               ];
               $new_array[] = $d;
           }
    }
}

有没有更好的方法来使用数组函数来拆分它们?

谢谢

【问题讨论】:

  • 为什么你认为这是低效的?您添加到新数组的元素数量正是它必须发生的次数......您无法减少它。无论如何,这个问题超出了 StackOverflow 的范围。你可以试试CodeReview,但我会考虑把这个问题放在一起。

标签: php arrays


【解决方案1】:

我认为您的解决方案还可以。在我的示例中,我使用递归函数来“隐藏”其中一个嵌套循环,并通过取消设置已处理的元素来节省一些内存(在示例中由 array_shift 完成)。

function rotate($array, $new_array = array()) {
    $sub_array = array_shift($array);
    $sub_array['b'] = explode(',', $sub_array['b']);
    $sub_array['c'] = explode(',', $sub_array['c']);

    while($b = array_shift($sub_array['b'])) {
    foreach($sub_array['c'] as $c) {
        $new_array[] = array('a' => $sub_array['a'], 'b' => $b, 'c' => $c);
    }
    }
    return $array ? rotate($array, $new_array) : $new_array;
}

$new_array = rotate($array);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2018-09-30
    • 2023-04-04
    相关资源
    最近更新 更多