2013-07-13 18 views
6

Mam tablicę:Przegrupuj tablica z wielu kluczy

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

Co chcę zrobić, to zorganizować to być tak:

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

Zrobiłem wiele funkcji tablicowych ale nadal tkwi w tym.

+1

Trzeba iterować nad nim i utworzyć pożądaną strukturę, nie ma na to gotowej funkcji. –

+0

@frozenade, twoje pytanie zostanie wysłuchane, czy możesz zaznaczyć jedną odpowiedź jako [zaakceptowano] (http://stackoverflow.com/help/accepted-answer)? –

Odpowiedz

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 za wysiłek i sportową rywalizację! –

+0

To niesamowite. +1 dla wszystkich. Dziękuję bardzo za Stéphane'a Bruckerta i Alixa Axela. Teraz po prostu konwertuję go do usługi xml. – frozenade

5

Jeśli zestaw pól pozostaje taka sama, jak:

  1. Waluta
  2. Kup wartość
  3. wartość Sprzedam

następnie można zrobić:

$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, ładny! ;) –

+1

Prawdopodobnie musisz wykonać '$ i_currency = $ old_array [$ i]' tho, a następnie po prostu użyć '$ i' na indeksy kupna/sprzedaży. –

0

Jeśli mogę zaufać strukturalny charakter macierzy wejściowej, mogę zapewnić gładki jedno-liner (bez o/while) dla Ciebie ...

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

wyjściowa:

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', 
), 
) 

Oto podział mojego array_map() funkcji przy użyciu 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 
); 

Późno Edit (myślałem, że spadek o zmiennej liczbie argumentów funkcji w który zapewnia również taki sam efekt):

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

Przypadkowo, obie metody jedno-liner mieć dokładny Ta sama długość postaci, tak przypuszczam, że sprowadza się to do osobistych preferencji.