2017-04-19 59 views
2

我有此数组:爆炸阵列的数据,并做出新的阵列

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => a,b,c 
     ) 

    [1] => Array 
     (
      [0] => 5 
      [1] => d,e,f 
     ) 
) 

我想最终的数组是这样的:

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => a 
     ) 

    [1] => Array 
     (
      [0] => 1 
      [1] => b 
     ) 

    [2] => Array 
     (
      [0] => 1 
      [1] => c 
     ) 

    [3] => Array 
     (
      [0] => 5 
      [1] => d 
     ) 

    [4] => Array 
     (
      [0] => 5 
      [1] => e 
     ) 

    [5] => Array 
     (
      [0] => 5 
      [1] => f 
     ) 
) 

这是我做过什么:

<?php 
    $array = array(array(1,"a,b,c"),array(5,"d,e,f")); 
    $temp=array(); 
    $count = 0; 
    foreach($array as $arr){ 
     $rows = explode(",",$arr[1]); 
     foreach($rows as $row){ 
      $temp[$count] = $arr; 
      $temp[$count][1] = $row; 
      $count++; 
     } 
    } 
    print_r($temp); 
?> 

这完全有效,但我想知道是否有更好的方法来做到这一点。当我有大量数据时,这可能会非常缓慢。

+0

使用循环通常将是最快的方式。通常缓慢是由低效循环引起的,但在这里并不是这种情况。您的数据集必须是真正的MASSIVE,因为这会对脚本的执行时间产生重大影响。 – Scopey

+0

你是说这是做到这一点的最好方法吗? – Prakash

+0

是的。循环通常总是最快的方式。使用像'array_map'这样的回调函数(不是这样可以工作)会更慢。 – Scopey

回答

1

尝试像这样...

<?php 

$array = array(array(1,"a,b,c"),array(5,"d,e,f")); 
$temp=array(); 
$count = 0; 
foreach($array as $arr){ 
    $rows = explode(",",$arr[1]); 
    foreach($rows as $row){ 
     $temp[$count][] = $arr[0]; 
     $temp[$count][] = $row; 
     $count++; 
    } 
} 

/*print "<pre>"; 
    print_r($temp); 
    print "<pre>";*/ 

?> 
+0

有什么区别?先生,您有没有读过这个问题? – Prakash

+0

哦,对不起,我的错误,这段代码给出了和你的代码一样的结果... –

+0

问题是你从问题本身复制代码,不得不投票你 – Prakash

0

如果您需要周围的其他方式,

$array = array(array(1, "a,b,c"), array(5, "d,e,f")); 
$temp = []; 
array_walk($array, function ($item, $key) use (&$temp) { 
    $second = explode(',', $item[1]); 
    foreach ($second as $v) { 
     $temp[] = [$item[0], $v]; 
    } 
}); 
print_r($temp); 

array_walk - 应用用户提供的函数,一个阵列中的每个成员

这里正在工作demo

1

这里有一个功能的方法:

$result = array_merge(...array_map(function(array $a) { 
    return array_map(function($x) use ($a) { 
     return [$a[0], $x]; 
    }, explode(",", $a[1])); 
}, $array)); 

Try it online

,或者只是两个循环:

$result = []; 
foreach ($array as $a) { 
    foreach (explode(",", $a[1]) as $x) { 
     $result[] = [$a[0], $x]; 
    } 
} 

Try it online

时序这些揭示了一个简单的循环结构快了8倍。

  • 功能:4.06s user 0.08s system 99% cpu 4.160 total
  • 循环:0.53s user 0.05s system 102% cpu 0.561 total
+0

它比我们拥有的更快吗? – Prakash

+0

@Prakash:没有,实际上比简单循环数组要慢得多。我相应地修改了我的答案。 – Joe