【问题标题】:How can I convert an array of strings into an associative array in PHP?如何在 PHP 中将字符串数组转换为关联数组?
【发布时间】:2020-09-04 14:15:54
【问题描述】:

我目前有一个由三个字符串组成的数组,我的目标是将数组中的这三个字符串变成单独的关联数组。

这是数组:

$arr = array(

  "action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL",

  "action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y",

  "action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20",

我希望关联数组的键是动作、数量、项目代码等,开始时我想我应该尝试将数组的内容转换为字符串以使其更易于管理。

// Convert $arr to a string.
$imploded = implode(": ",$arr);
//echo $imploaded;
$str = $imploded;
$results = preg_split('/: [;,]/', $str);
print_r($results);

理想情况下,我希望数组看起来像这样。我对 PHP 很陌生,所以任何帮助和建议都将不胜感激。

array(
    'action'    =>   '',
    'amount'    =>   '',
    'code'  =>   '',
    'name'  =>   '',
    'colour'    =>   '',
    'size'      =>   '',
);

【问题讨论】:

标签: php arrays string


【解决方案1】:

这可能是你需要的:

<?php

$arr = array(   
  "action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL",    
  "action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y",    
  "action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20"
);
    


foreach ($arr as $string) {
   //Build array
   preg_match_all("/ [ ]?([^:]+): ([^;]+)[ ;]? /x", $string, $p);
   $array = array_combine($p[1], $p[2]);

   //Print it or do something else with it
    print_r($array);
}

https://3v4l.org/0cnhZ

您可能也想检查一下:
PHP Split Delimited String into Key/Value Pairs (Associative Array)

【讨论】:

  • 这个答案缺少教育解释。
【解决方案2】:

就这么简单:

$arr = array(
    "action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL",
    "action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y",
    "action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20",
);
  
$data = [];
foreach ($arr as $line) {
    $newItem = [];
    foreach (explode(';', $line) as $item) {
        $parts = explode(':', $item);
        $newItem[trim($parts[0])] = trim($parts[1]);
    }
    $data[] = $newItem;
}

print_r($data);

小提琴here.

【讨论】:

  • 这个答案缺少教育解释。
【解决方案3】:

你可以使用:

$tempArray = array();

foreach($arr as $data){
    $dataExplode = explode(';', $data);
      $temp = array();
    foreach($dataExplode as $key => $child){
              $childExplode = explode(':', $child);
              $temp[$childExplode[0]] = $childExplode[1];
    }
      array_push($tempArray, $temp);
}

print_r($tempArray); //to print array collection

您将获得单独的array() 的集合

【讨论】:

  • 这个答案缺少教育解释。
【解决方案4】:
$arr = [
    "action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL",
    "action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y",
    "action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20",
];

$keyed = array_reduce($arr, function($collector, $value) {
    $collector[] = array_reduce(explode('; ', trim($value, '; ')), function($collector, $value) {
        $parts = explode(': ', $value);
        $collector[$parts[0]] = $parts[1];
        
        return $collector;
    }, []);
    
    return $collector;
}, []);

https://3v4l.org/lLl6T

【讨论】:

  • 这个答案缺少教育解释。
【解决方案5】:

只是为了好玩,还有另一种方法:

$arr = array(
  "action: Added; amount: 1; code: RNA1; name: Mens Organic T-shirt; colour: White; size: XL",
  "action: Subtracted; amount: 7; code: RNC1; name: Kids Basic T-shirt; colour: Denim Blue; size: 3-4y",
  "action: Added; amount: 20; code: RNV1; name: Gift Voucher; style: Mens; value: £20",
);

$result = array_map(function($line) {
    return array_combine(...array_map(null, ...array_chunk(preg_split('/[:;]\s+/', $line), 2)));

}, $arr);

print_r($result);

基本上,这里我们用两个可能的分隔符分隔行,:;,后跟空格。

然后array_chunk 函数将键和值组合在一起,我们为每一行得到如下内容:

        Array
        (
            [0] => Array
                (
                    [0] => action
                    [1] => Added
                )

            [1] => Array
                (
                    [0] => amount
                    [1] => 1
                )
* * *

通过扩展和映射上面的数组,我们得到它的旋转版本,如下所示:

Array
        (
            [0] => Array
                (
                    [0] => action
                    [1] => amount
* * *
                )

            [1] => Array
                (
                    [0] => Added
                    [1] => 1
* * *
                )
        )

我们现在可以扩展这个数组并将其传递给array_combine 函数,这样我们就有了一个很好的关联数组,其中填充了所需的键和值。

然后我们映射所有行,这样我们就得到了格式良好的结果。

Here is the final fiddle.

【讨论】:

    【解决方案6】:

    另一种不使用循环的解决方案:

    $res = array_reduce(
        $arr, 
        function($acc, $item) {
            $s = array_reduce(
                explode(';', $item),
                function($a, $el) {
                    $p = explode(': ', $el);
                    $a[trim($p[0])] = trim($p[1]);
                    return $a;
                },
                []
            );
            array_push($acc, $s);
            return $acc;
        },
        []
    );
            
    print_r($res);
    

    Run PHP code here

    【讨论】:

    • 这个答案缺少教育解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2012-06-10
    • 2018-03-08
    • 1970-01-01
    • 2012-03-01
    相关资源
    最近更新 更多