将多维数组的每个子集中的列值合并为逗号分隔值

问题描述 投票:0回答:2

我在重新构建 PHP 数组时遇到一些麻烦。我需要更改它以使用 tfPDF 库将表格打印到 PDF 文档。

我用

foreach()
循环、
array_walk()
array_walk_recursive()
array_chunk()
array_slice()
尝试过 - 到目前为止没有成功。

这是我的数组$data:

$data = [
    "file_id" => 1394,
    "user_id" => 463466,
    "periode" => 2022,
    "costs" => 64.45,
    "values" => [
        "457" => [
            "1" => [
                "data_id" => 1,
                "supplier_id" => 457,
                "costs1" => 1000,
                "costs2" => 100,
                "group_name" => "7%",
            ],
            "140" => [
                "data_id" => 140,
                "supplier_id" => 457,
                "costs1" => 2000,
                "costs2" => 50,
                "group_name" => "19%",
            ],
            "197" => [
                "data_id" => 197,
                "supplier_id" => 457,
                "costs1" => 3000,
                "costs2" => 300,
                "group_name" => "special",
            ],
        ],
        "430" => [
            "490" => [
                "data_id" => 490,
                "supplier_id" => 430,
                "costs1" => 500,
                "costs2" => 30,
                "group_name" => "new 4",
            ],
            "552" => [
                "data_id" => 552,
                "supplier_id" => 430,
                "costs1" => 7000,
                "costs2" => 250,
                "group_name" => "new 5",
            ],
        ],
        "425" => [
            "1106" => [
                "data_id" => 1106,
                "supplier_id" => 425,
                "costs1" => 10,
                "costs2" => 4,
                "group_name" => "new 6",
            ],
        ],
    ],
];

对于打印功能,以下格式是最好的:

$pdf->Row(array(
    "data_id \n" .
    "data_id \n" .
    "data_id",

    "supplier_id \n" .
    "supplier_id \n" .
    "supplier_id",
                        
    "costs1 \n" .
    "costs1 \n" .
    "costs1",
                        
    "costs2 \n" .
    "costs2 \n" .
    "costs2",
                        
    "group_name \n" .
    "group_name \n" .
    "group_name",
));

所以我需要将 $data 更改为这样的数组:

[
    'file_id' => 1394,
    'user_id' => 463466,
    'periode' => 2022,
    'costs' => 64.45,
    'values' => [
        457 => [
            'data_id' => '1, 140, 197',
            'supplier_id' => '457, 457, 457',
            'costs1' => '1000, 2000, 3000',
            'costs2' => '100, 50, 300',
            'group_name' => '7%, 19%, special',
        ],
        430 => [
            'data_id' => '490, 552',
            'supplier_id' => '430, 430',
            'costs1' => '500, 7000',
            'costs2' => '30, 250',
            'group_name' => 'new 4, new 5',
        ],
        425 => [
            'data_id' => 1106,
            'supplier_id' => 425,
            'costs1' => 10,
            'costs2' => 4,
            'group_name' => 'new 6',
        ],
    ],
]; 

你能帮我吗?

最后一步是像这样的逗号分隔:

array_walk($data['values'], function (&$val) {
    $val[] = implode(", ", $val[]);
});
php arrays multidimensional-array grouping delimited
2个回答
0
投票

一些循环和测试,它应该可以工作:

<?php
$arr = array(
    "file_id" => 1394,
    "user_id" => 463466,
    "periode" => 2022,
    "costs" => 64.45,
    "values" => array(
        "457" => array(
            "1" => array(
                "data_id" => 1,
                "supplier_id" => 457,
                "costs1" => 1000,
                "costs2" => 100,
                "group_name" => "7%",
            ),

            "140" => array(
                "data_id" => 140,
                "supplier_id" => 457,
                "costs1" => 2000,
                "costs2" => 50,
                "group_name" => "19%",
            ),

            "197" => array(
                "data_id" => 197,
                "supplier_id" => 457,
                "costs1" => 3000,
                "costs2" => 300,
                "group_name" => "special",
            ),

        ),

        "430" => array(
            "490" => array(
                "data_id" => 490,
                "supplier_id" => 430,
                "costs1" => 500,
                "costs2" => 30,
                "group_name" => "new 4",
            ),

            "552" => array(
                "data_id" => 552,
                "supplier_id" => 430,
                "costs1" => 7000,
                "costs2" => 250,
                "group_name" => "new 5",
            ),

        ),

        "425" => array(
            "1106" => array(
                "data_id" => 1106,
                "supplier_id" => 425,
                "costs1" => 10,
                "costs2" => 4,
                "group_name" => "new 6",
            ),

        ),

    ),

);

$values = $arr['values'];
$result = [];
foreach ($values as $key1 => $value1) {
    $result[$key1] = [];
    foreach ($value1 as $key2 => $value2) {
        foreach ($value2 as $key3 => $value3) {
            $result[$key1][$key3][] = $value3;
        }
    }
    foreach ($result[$key1] as $key2 => $value2) {
        $result[$key1][$key2] = implode(', ', $value2);
    }
}
$arr['values'] = $result;
print_r($arr);

输出:

Array
(
    [file_id] => 1394
    [user_id] => 463466
    [periode] => 2022
    [costs] => 64.45
    [values] => Array
        (
            [457] => Array
                (
                    [data_id] => 1, 140, 197
                    [supplier_id] => 457, 457, 457
                    [costs1] => 1000, 2000, 3000
                    [costs2] => 100, 50, 300
                    [group_name] => 7%, 19%, special
                )

            [430] => Array
                (
                    [data_id] => 490, 552
                    [supplier_id] => 430, 430
                    [costs1] => 500, 7000
                    [costs2] => 30, 250
                    [group_name] => new 4, new 5
                )

            [425] => Array
                (
                    [data_id] => 1106
                    [supplier_id] => 425
                    [costs1] => 10
                    [costs2] => 4
                    [group_name] => new 6
                )

        )

)

0
投票

我会修改原始数组,使用嵌套循环来巩固结构,然后就地更新每个数据子集。

代码:(

foreach()
演示)(
array_walk()
演示
)(
array_map()
演示

foreach ($data['values'] as &$values) {
    $set = [];
    foreach ($values as $row) {
        if (!$set) {
            $set = $row;
        } else {
            foreach ($row as $k => $v) {
                $set[$k] .= ", $v";
            }
        }
        $values = $set;
    }
}
var_export($data);
© www.soinside.com 2019 - 2024. All rights reserved.