我该如何在PHP中将字符串数组转换为关联数组?

3

我目前有一个包含三个字符串的数组,我的目标是将这三个字符串从数组中分别转换为关联数组。

以下是该数组:

$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:将简单字符串转换为数组 - digijay
6个回答

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分隔的字符串拆分为键/值对(关联数组)


1
这个答案缺少教育性的解释。 - mickmackusa

0

你可以使用:

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


1
这个答案缺少教育性的解释。 - mickmackusa

0

就像这样简单:

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

请在这里试验代码


1
此答案缺少教育性解释。 - mickmackusa

0
$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


1
这个答案缺少教育性的解释。 - mickmackusa

0

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

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

在此运行PHP代码


1
这个答案缺少教育性的解释。 - mickmackusa

0

只是为了好玩,另一种实现方式:

$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函数,以便我们得到一个带有所需键和值的漂亮关联数组。
然后我们映射所有行,这样我们就可以得到格式良好的结果了。

这是最终的代码片段。


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