PHP的关联数组问题

问题描述

我正在围绕将数组存储在API中的理论场景构建算法,这意味着不允许我对其进行编辑,并且我正尝试从该数组中获取数据并将其转换为关联数组。爆炸和爆炸功能。我已经取得了不错的进展,到目前为止,这是我的代码……

<?PHP

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

// Split the array into strings.
$imploded1 = implode("; ",$arr);

//echo $imploded;

// Seperate the strings by the ";" character.
$exploded1 = explode("; ",$imploded1);
// This gives me the keys and pairs in the same index.

$imploded2 = implode("\n",$exploded1);
// print_r($formatimploded);

$result = array_column(array_map(function($v) {
    return explode(":",$v);
},explode(" ",$imploded2)),1,0);
print_r($result);

该程序几乎可以运行。我遇到的问题是没有将键的值添加到数组中,而且我不确定为什么这样做。这是输出

Array
(
[action] =>
[quantity] =>
[item_code] =>
[product_name] =>
[colour] =>
[size] =>
[style] =>
[value] =>
)

有人可以向我解释吗?非常感谢您的帮助。

解决方法

<?php

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

//create new array to hold new values
$new_arr = [];

//loop through strings
foreach($arr as $v) {

    //break strings into "chunks" (e.g "action: Added","quantity: 1",etc)
    $chunks = explode('; ',$v);

    //create temporary array inside "string loop"
    $tmp = [];

    //loop through each chunk
    foreach($chunks as $chunk) {

        //split chunks into key => values (e.g "action","added")
        $key_value = explode(': ',$chunk);

        //add split chunk to `$tmp` array,using `[0]` as key and `[1]` as value
        $tmp[$key_value[0]] = $key_value[1];
    }

    //after "chunk loop",add `$tmp` to `$new_arr`
    $new_arr[] = $tmp;
}

print_r($new_arr);

输出:

Array
(
    [0] => Array
        (
            [action] => Added
            [quantity] => 1
            [item_code] => RNA1
            [product_name] => Mens Organic T-shirt
            [colour] => White
            [size] => XL
        )

    [1] => Array
        (
            [action] => Subtracted
            [quantity] => 7
            [item_code] => RNC1
            [product_name] => Kids Basic T-shirt
            [colour] => Denim Blue
            [size] => 3-4y
        )

    [2] => Array
        (
            [action] => Added
            [quantity] => 20
            [item_code] => RNV1
            [product_name] => Gift Voucher
            [style] => Mens
            [value] => £20
        )

)
,

如果首先要负责实际存储这些数据的方式,那么最好以一种更加标准化的格式(例如JSON)进行存储。您的数据将更容易使用。

这是将其中一项存储为JSON的方式。请注意,这只是对当前使用的分号和非引号值的微小更改。

$json = '{"action": "Added","quantity": "1","item_code": "RNA1","product_name": "Mens Organic T-shirt","colour": "White","size": "XL"}';

然后在PHP中,您可以简单地使用json_decode()将其转换为对象:

$item = json_decode($json);

您可以像这样轻松地访问属性:

$item->quantity
$item->colour
$item->size

如果出于某种原因,您确实想要数组,则可以改为:

$item = json_decode($json,true);

哪个给:

Array
(
    [action] => Added
    [quantity] => 1
    [item_code] => RNA1
    [product_name] => Mens Organic T-shirt
    [colour] => White
    [size] => XL
)