PHP Создание вложенного массива с индексами из файла CSV - PullRequest
0 голосов
/ 28 января 2020

У меня странная проблема. У меня есть файл CSV, который содержит значения, разделенные запятыми, которые мне нужно загрузить, а затем получить вложенный массив значений на основе следующих 3 условий:

  1. Массив сначала l oop через все значения и получить первые 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
                        )

                )

        )

)

1 Ответ

1 голос
/ 28 января 2020

Это основано на чтении файла в формате csv (используя fgetcsv()) и извлечении первых 4 цифр первого значения в каждой строке. Затем он использует другой массив, чтобы дать ключ для 'single_devices' et c. ключ - использование счетчика количества элементов в строке (-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
                        )

                )
...