2013-07-13 48 views
6

我有一個數組:重排陣有多個按鍵

Array 
(
    [12] => USD 
    [13] => 10150.00 
    [14] => 9850.00 
    [15] => SGD 
    [16] => 8015.40 
    [17] => 7915.40 
    [18] => HKD 
    [19] => 1304.60 
    [20] => 1288.60 
    ... 
) 

我想要做的就是安排它是這樣的:

Array 
(
    [USD] => Array 
      (
       [Buy] => 10150.00 
       [Sell] => 9850.00 
      ) 
    [SGD] => Array 
      (
       [Buy] => 8015.40 
       [Sell] => 7915.40 
      ) 
    [HKD] => Array 
      (
       [Buy] => 1304.60 
       [Sell] => 1288.60 
      ) 
    ... 
) 

我已經做了很多的陣列功能,但仍然堅持這一點。

+1

你需要遍歷它並創建所需的結構,沒有準備好的功能。 –

+0

@frozenade,您的問題得到解答,請您將一個答案標記爲[接受](http://stackoverflow.com/help/accepted-answer)? –

回答

2

Demo


$data = array 
(
    'USD', 
    '10150.00', 
    '9850.00', 
    'SGD', 
    '8015.40', 
    '7915.40', 
    'HKD', 
    '1304.60', 
    '1288.60', 
); 

$result = array(); 

while (is_null($value = array_shift($data)) !== true) 
{ 
    if (preg_match('~^[A-Z]{3}$~', $value) > 0) 
    { 
     $result[$value] = array 
     (
      'Buy' => array_shift($data), 
      'Sell' => array_shift($data), 
     ); 
    } 
} 

print_r($result); // transformed array 
+1

+1努力,體育精神! –

+0

太棒了。爲所有人+1。非常感謝StéphaneBruckert和Alix Axel。現在,我只是將其轉換爲xml服務。 – frozenade

5

如果字段的套件保持相同:

  1. 貨幣
  2. 購買價值
  3. 銷售值

那麼,你可以這樣做:

$old_array = array('USD', 123.00, 432.34, 'SGD', 421.41, 111.11); 
$new_array = array(); 

for ($i = 0; $i < count($old_array); $i = $i + 3) { 
    $new_array[$old_array[$i]] = array 
    (
     'Buy' => $old_array[$i + 1], 
     'Sell' => $old_array[$i + 2] 
    ); 
} 
+0

+1,很好! ;) –

+1

您可能需要執行'$ i_currency = $ old_array [$ i]'tho,然後在買/賣指數中使用'$ i'。 –

0

如果我可以信任你輸入數組的結構模式,我可以爲你提供圓滑的一行(沒有用於/ while循環)...

$input=array(
    12 => "USD", 
    13 => "10150.00", 
    14 => "9850.00", 
    15 => "SGD", 
    16 => "8015.40", 
    17 => "7915.40", 
    18 => "HKD", 
    19 => "1304.60", 
    20 => "1288.60" 
); 

array_map(function($a)use(&$output){$output[$a[0]]=["Buy"=>$a[1],"Sell"=>$a[2]];},array_chunk($input,3)); 

var_export($output); 

輸出:

array (
    'USD' => 
    array (
    'Buy' => '10150.00', 
    'Sell' => '9850.00', 
), 
    'SGD' => 
    array (
    'Buy' => '8015.40', 
    'Sell' => '7915.40', 
), 
    'HKD' => 
    array (
    'Buy' => '1304.60', 
    'Sell' => '1288.60', 
), 
) 

下面是使用我array_map()功能的故障:

array_map(      // iterate each subarray from array_chunk() 
    function($a)     // $a = each subarray 
     use(&$output){   // declare the output array as modifiable 
      $output[$a[0]]=  // use 1st subarray value as key 
       ["Buy"=>$a[1], // use 2nd subarray value as Buy value 
       "Sell"=>$a[2]]; // use 3rd subarray value as Sell value 
     }, 
    array_chunk($input,3)  // feed in an array of 3-element subarrays 
); 

後期編輯(我想我在這也提供了相同的輸出下降一個可變參數函數):

array_map(function($K,$B,$S)use(&$output){$output[$K]=["Buy"=>$B,"Sell"=>$S];},...array_chunk($input,3)); 

巧合的是,無論是一個班輪方法有確切相同的字符長度,所以它歸結爲個人喜好,我想。