2013-07-13 5 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 для всех. Большое спасибо за Стефана Бруктера и Аликса Акселя. Теперь я просто конвертирую его в службу xml. – frozenade

5

Если набор полей остается такой же, как:

  1. Валюта Значение
  2. Купить
  3. Sell значение

то, что вы можете сделать:

$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' для индексов buy/sell. –

0

Если я могу доверять структурную схему вашего входного массива, я могу предоставить гладкий Однострочник (без для/в то время как петля) для вас ...

$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_chunk():

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

Late Edit (я думал, что падение VARIADIC функции, которая также обеспечивает тот же результат):

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

совпадению, оба методы Однострочника имеет точную Я предполагаю, что это так.

Смежные вопросы