PHP 使用 CSV 文件中的索引创建嵌套数组

PHP Create a Nested Array with indexes from a CSV file

我遇到了一个特殊问题。我有一个 CSV 文件,其中包含我需要上传的逗号分隔值,然后根据以下 3 个条件获取值的嵌套数组;

  1. 数组将首先遍历所有值并获得前 4 个唯一值 人物。 (代码)
  2. 将每列值与数量相匹配 每行中的列并给出匹配 4 位数字的行数 代码。 (Single_Devices 用于单列,Dual、Triple 和 Quad 用于相应的列数)
  3. 将每列值与代码匹配并列出所有 设备下的列。 (数字)

CSV 文件

123429000000000
123429000000001
123429000000010,123429000000011
123429000000040,123429000000041

我想要的是;

Array
(
    [Code] => 1234
        (
            [single_devices] => 2
                (
                    [0] => Array
                        (
                            [0] => 123429000000000
                        )
                    [1] => Array
                        (
                            [0] => 123429000000001
                        )
                )
            [dual_devices] => 2
                (
                    [0] => Array
                        (
                            [0] => 123429000000010
                            [1] => 123429000000011
                        )
                    [1] => Array
                        (
                            [0] => 123429000000040
                            [1] => 123429000000041
                        )
                )
        )

)

可能吗? 我可以管理 JSON 转换后的数据或对象,或者只是关联嵌套数组。

编辑:这是我编写的代码,它只显示值而不是我想要的索引。

// Get all numbers in array
for ($j = 0; $j < count($csv_file[$i]); $j++){
    $numbers[] = $csv_file[$i][$j];
}

// Get codes from numbers
for ($i = 0; $i < count($csv_file); $i++){
    for ($j = 0; $j < count($csv_file[$i]); $j++){
        $codes[] = substr($csv_file[$i][$j], 0, 4);
    }
}

// Get unique codes from codes array
$codes = array_unique($codes);

// Get numbers and sort them codes and device count wise.
for ($i = 0; $i < count($csv_file); $i++){
    for ($j = 0; $j < count($csv_file[$i]); $j++){
        $q = count($csv_file[$i]); // set device count based on column count
        if (count($csv_file[$i]) == $q){ // if device count is equal to column count
            foreach ($codes as $code){ // loop through unique codes
                if ($code == substr($csv_file[$i][$j], 0, 4)){ // if number's first 4 char matches code
                    // create array with code and then device count and add numbers
                    $devices[$code][$q.'_device_numbers'][$i][$j] = preg_replace('/\s+/', '', $csv_file[$i][$j]);
                }
            }
        }
    }
}

这就是我从上面的代码中得到的结果。

Array
(
    [1234] => Array
        (
            [1_sim_imeis] => Array
                (
                    [0] => Array
                        (
                            [0] => 123429000000000
                        )

                    [1] => Array
                        (
                            [0] => 123429000000001
                        )

                )

            [2_sim_imeis] => Array
                (
                    [2] => Array
                        (
                            [0] => 123429000000010
                            [1] => 123429000000011
                        )

                    [3] => Array
                        (
                            [0] => 123429000000040
                            [1] => 123429000000041
                        )

                )

        )

)

这是基于将文件读取为 csv(使用 fgetcsv())并提取每行第一个值的前 4 位数字。然后它使用另一个数组为 'single_devices' 等键提供键 - 使用行上元素数的计数(-1 因为数组是基于 0 的)...

$fileName = "a.dat";
$output = [];
$baseData = [ 'single_devices', 'dual_devices', 'triple_devices', 'quad_devices' ];
$fh = fopen ( $fileName, "r" );
while ( ($data = fgetcsv($fh)) !== false )  {
    $code = substr($data[0], 0, 4);
    $output[$code][$baseData[count($data)-1]][] = $data;
}

fclose($fh);

print_r($output);

这与测试数据给出...

Array
(
    [1234] => Array
        (
            [single_devices] => Array
                (
                    [0] => Array
                        (
                            [0] => 123429000000000
                        )

                    [1] => Array
                        (
                            [0] => 123429000000001
                        )

                )

            [dual_devices] => Array
                (
                    [0] => Array
                        (
                            [0] => 123429000000010
                            [1] => 123429000000011
                        )

                    [1] => Array
                        (
                            [0] => 123429000000040
                            [1] => 123429000000041
                )

        )

)

while ( ($data = fgetcsv($fh)) !== false )  {
    $code = substr($data[0], 0, 4);
    if ( !isset($output[$code]))    {
        $output[$code] = ["code" => $code];
    }
    $deviceLabel = $baseData[count($data)-1];
    $output[$code][$deviceLabel]['count'] =
        ($output[$code][$deviceLabel]['count'] ?? 0) + 1;
    $output[$code][$deviceLabel][] = $data;
}

您可以获得...的输出

Array
(
    [1234] => Array
        (
            [code] => 1234
            [single_devices] => Array
                (
                    [count] => 2
                    [0] => Array
                        (
                            [0] => 123429000000000
                        )

                    [1] => Array
                        (
                            [0] => 123429000000001
                        )

                )