2017-07-18 43 views
0

我有一个数组数组。每个嵌套数组包含两个逗号分隔值的成员。我想要做的是将这些嵌套数组分解为多个数组。拆分嵌套数组可能更简单的方法

因此,例如,如果我有阵列的下面阵列...

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; 
      } 
    } 
} 

有没有更好的方法来分割这些使用数组函数?

谢谢

+0

您为什么认为这样效率低下?您添加到新阵列中的元素数量恰好是它发生的次数......您无法减少它。无论如何,这个问题超出了StackOverflow的范围。你可以尝试[CodeReview](https://codereview.stackexchange.com),但我会考虑把所有问题放在一起。 – trincot

回答

0

我认为你的解决方案是好的。在我的示例中,我使用递归函数来“隐藏”其中一个嵌套循环,并通过释放处理后的元素(由示例中的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);