2012-05-23 170 views
0

我有以下的數組:爆炸分隔字符串數組成兩個陣列

Array 
    (
     [0] => 10-7 
     [1] => 11-3 
     [2] => 11-7 
     [3] => 12-3 
     [4] => 12-7 
     [5] => 13-3 
     [6] => 13-7 
     [7] => 14-3 
     [8] => 14-7 
     [9] => 15-7 
    ) 

,我需要分成使用"-"作爲定界符兩個數組:

Array 
    (
     [0] => 10 
     [1] => 11 
     [2] => 11 
     [3] => 12 
     [4] => 12 
     [5] => 13 
     [6] => 13 
     [7] => 14 
     [8] => 14 
     [9] => 15 
    ) 

Array 
    (
     [0] => 7 
     [1] => 3 
     [2] => 7 
     [3] => 3 
     [4] => 7 
     [5] => 3 
     [6] => 7 
     [7] => 3 
     [8] => 7 
     [9] => 7 
    ) 

有沒有像array_explode什麼,做什麼,我想要什麼?或者結合php array的功能?我想如果可能的話要做到這一點,而無需通過我自己的for/each循環下去,或者至少減少不必重新發明輪子的東西時(僞)內置已經在那裏。我已經用for循環做了這個。但我不能動搖那種巧妙地使用數組函數或類似東西的更優雅方式的感覺。非常感謝,夥計們。

附加信息:

不知道它的問題,但得到的兩個數組中的唯一值後,我其實是:

Array 
    (
     [0] => 10 
     [1] => 11 
     [2] => 12 
     [3] => 13 
     [4] => 14 
     [5] => 15 
    ) 

Array 
    (
     [0] => 7 
     [1] => 3 
    ) 

的唯一值不需要排序,鍵可以保存或不保存,第一個數組的合法值範圍爲023,而第二個17。但是它可能比這些其他值(02317甚至未定流浪字符串或超出了我的控制的其他數據類型),我肯定會想扔出去。

+0

什麼您已經嘗試???告訴我們 –

+0

哦,我已經用for循環做了這個。但是我不能動搖那種巧妙地使用數組函數的更優雅的方式。 –

+0

@AnaBan將該信息添加到問題中,以便沒有人回答錯誤的問題。 – Ikke

回答

3

你要找的靈丹妙藥是array_reduce(),例如(PHP 5。3+):

list($left, $right) = array_reduce($input, 
    function($memo, $item) { 
    list($l, $r) = explode('-', $item); 
    $memo[0][$l] = $memo[1][$r] = true; 
    return $memo; 
    }, 
    array(array(), array()) 
); 

var_dump(array_keys($left), array_keys($right)); 

您可以see it in action here

隨着PHP < 5.3你必須提前申報時間的函數:

function my_reducer($memo, $item) { 
    list($l, $r) = // ... 
    // ... as above ... 
} 

list($left, $right) = array_reduce(
    $input, 'my_reducer', 
    array(array(), array()) 
); 
+0

絕對在這一個! brb更新.. –

+0

酷!子彈被解僱了!你的史詩。 –

+0

很高興它有用。 PHP的函數式數組函數('array_reduce','array_map','array_filter'等等)是PHP最有用和使用最少的函數之一。 –

0

這裏是您的解決方案,試圖實現下面的代碼。

應該爲你工作。

$main_array = array( 
     '0' => '10-7', 
     '1' => '11-3', 
     '2' => '11-7', 
     '3' => '12-3', 
     '4' => '12-7', 
     '5' => '13-3', 
     '6' => '13-7', 
     '7' => '14-3', 
     '8' => '14-7', 
     '9' => '15-7', 
     ); 

foreach($main_array as $key=>$value) 
{ 
    $arr_value  = explode('-',$value); 
    $arr_temp1[] = $arr_value[0]; 
    $arr_temp2[] = $arr_value[1]; 
} 
$arr_temp1_unique = array_unique($arr_temp1); 
$arr_temp2_unique = array_unique($arr_temp2); 


print "<pre>"; 
print_r($main_array); 
print_r($arr_temp1); 
print_r($arr_temp2); 

print_r($arr_temp1_unique); 
print_r($arr_temp2_unique); 
print "</pre>"; 
+0

謝謝,@pinaldesai。非常類似於我的for循環解決方案。 –

+0

歡迎您:)我希望這對你有用。 – pinaldesai

0

據我所知,在這種情況下沒有合適的PHP函數可以使用。

功能類似於array_walk()array_map()結果在單個陣列中,而不是在多個陣列。

你說你已經嘗試過了環路sollution,但對於幫助緣故,這裏是我會怎麼解決這個問題:

//$data contains the array you want to split 
$firstItems = array(); 
$secondItems = array(); 

foreach($data as $item) 
{ 
    list($first, $second) = explode('-', $item, 2); 
    $firstItems[$first] = true; 
    $secondItems[$second] = true;  
} 

//Now you can get the items with array_keys($firstItems) and array_keys($secondItems); 

我通過設置處理PHP數組作爲set鍵而不是值。這使得你不必使用array_unique()來獲得獨特的項目。

+0

謝謝@Ikke。好點的關鍵。 –

2

http://codepad.org/TpVUIhM7

<?php 
    $array = array('7-10','7-11','5-10'); 
    foreach($array as $a){list($x[], $y[]) = explode("-", $a);} 
    print_r(array_unique($x)); 
    print_r(array_unique($y)); 
?> 
+0

謝謝Andrius,我們也會努力工作。我會看看,如果我可以把它與@Ikke的答案混合起來。 –

+1

Teeeheee,我的代碼最少:P我贏了! :D jk;祝你好運,很高興我們幫助你:) –

0

嘗試:

foreach($old_array as $array){ 
    $new_2d_array = explode('-', $array); 
    $new_array_1[] = $new_2d_array[0]; 
    $new_array_2[] = $new_2d_array[1]; 
} 
$new_array_1 = array_unique($new_array_1); 
$new_array_2 = array_unique($new_array_2); 
+0

謝謝,維沙爾。非常類似於我的for循環和@pinaldesai的解決方案。 –