2013-07-13 12 views
6

Ich habe ein Array:Rearrange Array mit mehreren Schlüsseln

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

Was ich tun möchte, ist es arrangieren so sein:

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

Ich habe eine Menge von Array-Funktionen getan, aber haftete immer noch daran.

+1

Sie müssen darüber iterieren und gewünschte Struktur erstellen, es gibt keine fertige Funktion dafür. –

+0

@frozenade, Ihre Frage wird beantwortet, können Sie bitte eine Antwort als [akzeptiert] markieren (http://stackoverflow.com/help/accepted-answer)? –

Antwort

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 für die Anstrengung und die Sportlichkeit! –

+0

Das ist erstaunlich. +1 für alle. Vielen Dank für Stéphane Bruckert und Alix Axel. Jetzt wandle ich es einfach in XML-Dienst um. – frozenade

5

Wenn die Suite von Feldern bleibt die gleiche wie:

  1. Währung
  2. kaufen Wert
  3. Verkaufen Wert

dann können Sie tun:

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

+1

Sie müssen wahrscheinlich '$ i_currency = $ old_array [$ i]' tho machen und dann einfach '$ i' auf den Buy/Sell Indizes verwenden. –

0

Wenn ich dem strukturelle Muster Ihres Eingabe-Array vertrauen kann, ich einen schlanken Einzeiler (ohne für/While-Schleifen) für Sie zur Verfügung stellen kann ...

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

Ausgang:

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

Hier ist die Aufschlüsselung meiner array_map() Funktion 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 
); 

Späte Edit (ich dachte, dass ich in das bietet auch die gleiche Leistung eine variadische Drop-Funktion würde):

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

Zufälligerweise beide Einzeiler Methoden die genaue haben gleiche Zeichenlänge, so kommt es auf die persönliche Präferenz an, nehme ich an.

Verwandte Themen