2017-04-19 69 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