使用多个键重新排列数组

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
你需要遍历它并创建所需的结构,没有现成的函数可以做到这一点。 - dev-null-dweller
@frozenade,你的问题已经得到回答,能否请你标记一个被接受的答案 - Stéphane Bruckert
3个回答

5

如果字段套件保持不变,如下所示:

  1. 货币
  2. 购买价值
  3. 销售价值

那么,您可以执行以下操作:

$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
你可能需要执行 $i_currency = $old_array[$i],然后在买入/卖出索引上仅使用 $i - Alix Axel

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 给大家。非常感谢 Stéphane Bruckert 和 Alix Axel。现在,我只需将其转换为 XML 服务。 - frozenade

0

由于您的输入数组的结构模式是可靠的,因此我可以提供一种功能性方法(无需使用for/while循环,在全局空间中也不需要新变量)。

代码:(演示

var_export(
    array_reduce(
        array_chunk($input, 3),
        function($carry, $item) {
            $carry[$item[0]] = ["Buy" => $item[1], "Sell" => $item[2]];
            return $carry;
        },
        []
    )
);

输出:

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_chunk()从输入数组中创建3个连续元素的数组。
array_reduce()用于形成新的关联输出数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接