2013-07-13 13 views
6

Ho un array:Riorganizza array con più chiavi

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

Quello che voglio fare è organizzare per essere come questo:

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

Ho fatto un sacco di funzioni per gli array, ma ancora bloccato con questo.

+1

È necessario iterare su di esso e creare la struttura desiderata, non esiste una funzione pronta per questo. –

+0

@frozenade, risposta alla tua domanda, puoi contrassegnare una risposta come [accettato] (http://stackoverflow.com/help/accepted-answer)? –

risposta

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 per lo sforzo e la sportività! –

+0

È fantastico. +1 per tutti Grazie mille per Stéphane Bruckert e Alix Axel. Ora, lo converto in servizio xml. – frozenade

5

Se la suite di campi rimane la stessa:

  1. valuta
  2. Acquista valore
  3. Vendo valore

allora, si può fare:

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

+1

Probabilmente hai bisogno di '$ i_currency = $ old_array [$ i]' tho, e poi usa '$ i' sugli indici buy/sell. –

0

Se posso fidarmi il modello strutturale del vostro array di input, posso fornire di un elegante one-liner (senza per/while) per voi ...

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

uscita:

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

Ecco la ripartizione della mia array_map() funzione utilizzando 01.233.817,706 mila:

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

tardo Edit (ho pensato di cadere una funzione variadic in che fornisce anche la stessa uscita):

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

Casualmente, entrambi i metodi uno-liner hanno l'esatto La stessa lunghezza del carattere, quindi si tratta di preferenze personali, suppongo.