将带有尾随 3 个字母货币的美元金额逗号分隔字符串拆分为以货币为键,金额为值的关联数组


Split comma-delimited string of dollar amounts with trailing 3-letter currency into associative array with currency as keys and amount as values

>I 有字符串是:

$string = '200AUD, 150USD, 80GBP, 1250000VND';

如何从 $string 转换为键 => 值的数组。

Key: AUD => Value 200
Key: USD => Value 150
Key: GBP => 80
Key: VND => 1250000

更新:

@Mark Baker,我的php版本是5.4,所以我无法测试您的代码,谢谢

@Aleatoric我使用此代码,但数组在键和值上返回一些空格字符:

                Array
(
    [ CHF] => 130 
    [  GBP] =>  80 
    [  USD] =>  125 
    [  DKK] =>  750 
    [  PLN] =>  400 
    [  CZK] =>  2500 
    [  YTL] =>  175 
    [  BGN] =>  175 
    [  RUB] =>  4000 
    [  RON] =>  400 
    [  SEK] =>  1000 
)
我使用 trim()

来剥离所有空间,但你能告诉我不使用 trim() 函数的情况下解决这个问题的最佳主意吗?

您必须先使用以下命令分解字符串:

$array1 = explode(',', $string);

然后使用 foreach 循环迭代元素以拆分字符串并将它们放入关联数组中:

$array2 = array();
foreach($array1 as $string){
    $currency = trim(preg_replace("/[0-9]+/", "", $string));
    $value = trim(preg_replace("/[a-zA-Z]+/", "", $string));
    $array2[$currency] = $value;
}

需要 PHP>= 5.5

$string = '200AUD, 150USD, 80GBP, 1250000VND';
$currencyArray = array_column(
    array_map(
        function ($value) {
            return sscanf($value, '%d%s');
        },
        explode(',', $string)
    ),
    0,
    1
);
var_dump($currencyArray);

我更喜欢使用 sscanf() 像 @MarkBaker 的答案一样,因为它允许将数值显式转换为整数类型,但为了尽量减少周期数,我建议array_reduce(),因为它将允许键声明。

代码:(演示)

$string = '200AUD, 150USD, 80GBP, 1250000VND';
var_export(
    array_reduce(
        explode(',', $string),
        function ($result, $amount) {
            [
                1 => $currency,
                0 => $result[$currency]
            ] = sscanf($amount, '%d%s');
            return $result;
        },
        []
    )
);

输出:

array (
  'AUD' => 200,
  'USD' => 150,
  'GBP' => 80,
  'VND' => 1250000,
)

在解构sscanf()的返回值时,上面的脚本首先为第二个元素([1])声明一个变量。 然后,该变量可以立即用于将金额推送到数组中,并将相关货币作为键。

<小时 />

无需任何棘手的解构,可以使用联合运算符 + 将关联元素添加到结果数组中。(演示)

var_export(
    array_reduce(
        explode(',', $string),
        function ($result, $money) {
            sscanf($money, '%d%s', $amount, $currency);
            return $result + [$currency => $amount];
        },
        []
    )
);