使用多个键重新排列数组

时间:2013-07-13 16:41:49

标签: php arrays

我有一个数组:

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

我已经完成了很多数组函数,但仍然坚持这一点。

3 个答案:

答案 0 :(得分:5)

如果字段组保持不变:

  1. 货币
  2. 购买价值
  3. 卖出价值
  4. 然后,你可以这样做:

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

答案 1 :(得分: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

答案 2 :(得分:0)

如果我可以信任输入数组的结构模式,我可以为你提供一个光滑的单行(没有for / 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_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
);

延迟编辑(我认为我删除了一个可变参数函数,也提供了相同的输出):

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

巧合的是,两种单行方法都具有完全相同的字符长度,因此我认为这取决于个人偏好。