Объединить / объединить (не уверен, что мне нужно?) Массив php, если ключи [любые] [0] совпадают - PullRequest
0 голосов
/ 15 марта 2020

Используя следующий код, я могу преобразовать загруженный CSV-файл в массив php.

    <?PHP
function readCSV($csvFile){
    $file_handle = fopen($csvFile, 'r');
    fgetcsv($file_handle);
    fgetcsv($file_handle);
    fgetcsv($file_handle);
    while (!feof($file_handle) ) {
        $line_of_text[] = fgetcsv($file_handle, 1024);
    }
    fclose($file_handle);
    return $line_of_text;
}


// Set path to CSV file
$csvFile = 'test.csv';

$csv = readCSV($csvFile);
?>

Затем я могу просмотреть массив на своей странице с помощью ..

<code><?php echo '<pre>';
print_r($csv);
echo '
'; ?>

Это выводит массив следующим образом (выглядит как реальные данные, но был анонимным) ..

Array
(
    [0] => Array
        (
            [0] => 15304
            [1] => 15-04478-27247
            [2] => ersmith0
            [3] => eric smith
            [4] => myemail@gmail.com
            [5] => 
            [6] => 2 Any Close
            [7] => 
            [8] => Manchester
            [9] => Greater Manchester
            [10] => M1 5BB
            [11] => United Kingdom
            [12] => eric smith
            [13] => +44 7719 123456
            [14] => 27 Any Close
            [15] => 
            [16] => Manchester
            [17] => Greater Manchester
            [18] => M1 5BB
            [19] => United Kingdom
            [20] => 
            [21] => 
            [22] => 
            [23] => 
            [24] => 2
            [25] => £3.90
            [26] => £0.00
            [27] => 
            [28] => £0.00
            [29] => £0.00
            [30] => £3.90
            [31] => No
            [32] => PayPal
            [33] => 30-Jan-20
            [34] => 30-Jan-20
            [35] => 
            [36] => 
            [37] => 
            [38] => 31-Jan-20
            [39] => 
            [40] => 
            [41] => 
            [42] => 5LD0123456789U
            [43] => Royal Mail 1st Class
            [44] => 
            [45] => 
            [46] => 
            [47] => No
            [48] => 
            [49] => No
            [50] => 
            [51] => No
        )

    [1] => Array
        (
            [0] => 15304
            [1] => 15-04478-27247
            [2] => ersmith0
            [3] => 
            [4] => 
            [5] => 
            [6] => 
            [7] => 
            [8] => 
            [9] => 
            [10] => 
            [11] => 
            [12] => 
            [13] => 
            [14] => 
            [15] => 
            [16] => 
            [17] => 
            [18] => 
            [19] => 
            [20] => 302804801330
            [21] => CAUTION DRIVEN BY A BIKER  - Fun Vinyl Decal Sticker 4x4/Car/Lorry/Van/Camper
            [22] => 
            [23] => No
            [24] => 1
            [25] => £1.95
            [26] => 
            [27] => 
            [28] => 
            [29] => 
            [30] => 
            [31] => 
            [32] => 
            [33] => 30-Jan-20
            [34] => 
            [35] => 
            [36] => 
            [37] => 
            [38] => 31-Jan-20
            [39] => No
            [40] => 
            [41] => 
            [42] => 
            [43] => 
            [44] => 
            [45] => 1711351782020
            [46] => 
            [47] => 
            [48] => 
            [49] => 
            [50] => 
            [51] => 
        )

    [2] => Array
        (
            [0] => 15304
            [1] => 15-04478-27247
            [2] => ersmith0
            [3] => 
            [4] => 
            [5] => 
            [6] => 
            [7] => 
            [8] => 
            [9] => 
            [10] => 
            [11] => 
            [12] => 
            [13] => 
            [14] => 
            [15] => 
            [16] => 
            [17] => 
            [18] => 
            [19] => 
            [20] => 302804815489
            [21] => Warning Biker With an Attitude Annoy At Your Own Risk Car Vinyl Decal Sticker
            [22] => 
            [23] => No
            [24] => 1
            [25] => £1.95
            [26] => 
            [27] => 
            [28] => 
            [29] => 
            [30] => 
            [31] => 
            [32] => 
            [33] => 30-Jan-20
            [34] => 
            [35] => 
            [36] => 
            [37] => 
            [38] => 31-Jan-20
            [39] => No
            [40] => 
            [41] => 
            [42] => 
            [43] => 
            [44] => 
            [45] => 1711351781020
            [46] => 
            [47] => 
            [48] => 
            [49] => 
            [50] => 
            [51] => 
        )

    [3] => Array
        (
            [0] => 15305
            [1] => 25-04445-36722
            [2] => pod69
            [3] => mart badger
            [4] => martsemailddr34@gmail.com
            [5] => 
            [6] => Via Riccione N. 35/30
            [7] => 
            [8] => Sa Tiacca Quartu S. Elena
            [9] => CA
            [10] => 09445
            [11] => Italy
            [12] => Badger Mart
            [13] => +39 987 654 3211
            [14] => Via Riccione N. 35/30
            [15] => 
            [16] => Sa Tiacca Quartu S. Elena
            [17] => CA
            [18] => 09445
            [19] => Italy
            [20] => 302667176336
            [21] => 2x Funny Car & Van or Camper WV Eyelash Vinyl Sticker Decal, Signs - Any Colour!
            [22] => 
            [23] => No
            [24] => 2
            [25] => £1.99
            [26] => £3.14
            [27] => 
            [28] => £0.00
            [29] => £0.00
            [30] => £7.12
            [31] => No
            [32] => PayPal
            [33] => 23-Jan-20
            [34] => 23-Jan-20
            [35] => 24-Jan-20
            [36] => 
            [37] => 
            [38] => 24-Jan-20
            [39] => Yes
            [40] => 
            [41] => 
            [42] => 25C157351T6888860U
            [43] => Royal Mail International Standard
            [44] => 
            [45] => 1709118816020
            [46] => 
            [47] => No
            [48] => 
            [49] => No
            [50] => 
            [51] => No
        )

    [4] => Array
        (
            [0] => 15306
            [1] => 20-04482-41274
            [2] => wideboiy38887
            [3] => Paul Lastname
            [4] => wideboiysemail@hotmail.co.uk
            [5] => Yellow please
            [6] => 10
            [7] => Broomstick Lane
            [8] => Okehampton
            [9] => Devon
            [10] => EX19 2FT
            [11] => United Kingdom
            [12] => Paul Lastname
            [13] => +44 7866 401983
            [14] => 105
            [15] => Broomstick Lane
            [16] => Okehampton
            [17] => Devon
            [18] => EX19 2FT
            [19] => United Kingdom
            [20] => 302755568952
            [21] => Junglist Soldier Car Window Laptop Wall Gift Drum Bass dnb Jungle Vinyl Sticker
            [22] => 
            [23] => No
            [24] => 1
            [25] => £1.99
            [26] => £0.00
            [27] => 
            [28] => £0.00
            [29] => £0.00
            [30] => £1.99
            [31] => No
            [32] => PayPal
            [33] => 01-Feb-20
            [34] => 01-Feb-20
            [35] => 03-Feb-20
            [36] => 
            [37] => 
            [38] => 
            [39] => No
            [40] => 
            [41] => 
            [42] => 7SD68673EE789782X
            [43] => Royal Mail 1st Class
            [44] => 
            [45] => 1711667179020
            [46] => 
            [47] => No
            [48] => 
            [49] => No
            [50] => 
            [51] => No
        )

    <!-And so on.....>

Если вы посмотрите на [0], [1] & [2] вы увидите, что все они являются частью одного и того же номера записи о продажах (поэтому [0] [0], [1] [0] & [2] [0] - это одно и то же число) (но элементы [3] [ 0] и [4] [0] - отдельные заказы / разные номера). (помните, что это всего лишь пример, данные меняются, может быть сотни заказов и может быть 1 или несколько элементов на номер заказа.)

Я хотел бы объединить массивы для заказов с одинаковыми номер записи о продаже [любой] [0]

Так что-то вроде ....

если [любой] [0] совпадают друг с другом, то объединить массив

Это будет означают, что вся информация для номера заказа, который соответствует, будет в 1 массиве на номер заказа.

Я хочу сохранить все данные (игнорировать пробелы), но объединить их / объединить в соответствующий массив верхнего уровня как суб массивы так, например .. если [1] [0] соответствует [2] [0], все данные от [2] [0] до [2] [51] (которые не являются пустыми или одинаковыми) должны быть добавлены на [1], так что это становится как ...

Array
(
    [0] => Array
        (
            [0] => 15304
            [1] => 15-04478-27247
            [2] => ersmith0
            [3] => eric smith
            [4] => myemail@gmail.com
            [5] => 
            [6] => 2 Any Close
            [7] => 
            [8] => Manchester
            [9] => Greater Manchester
            [10] => M1 5BB
            [11] => United Kingdom
            [12] => eric smith
            [13] => +44 7719 123456
            [14] => 27 Any Close
            [15] => 
            [16] => Manchester
            [17] => Greater Manchester
            [18] => M1 5BB
            [19] => United Kingdom
            [20] => 
            [21] => Array (
                [0] => CAUTION DRIVEN BY A BIKER  - Fun Vinyl Decal Sticker 4x4/Car/Lorry/Van/Camper
                [1] => Warning Biker With an Attitude Annoy At Your Own Risk Car Vinyl Decal Sticker
            )
            [22] => 
            [23] => 
            [24] => Array (
                [0] => 1
                [1] => 1
            ) 
            [25] => Array (
                [0] => 1.95
                [1] => 1.95
            ) 
            [26] => £0.00
            [27] => 
            [28] => £0.00
            [29] => £0.00
            [30] => £3.90
            [31] => No
            [32] => PayPal
            [33] => 30-Jan-20
            [34] => 30-Jan-20
            [35] => 
            [36] => 
            [37] => 
            [38] => 31-Jan-20
            [39] => 
            [40] => 
            [41] => 
            [42] => 5LD0123456789U
            [43] => Royal Mail 1st Class
            [44] => 
            [45] => 
            [46] => 
            [47] => No
            [48] => 
            [49] => No
            [50] => 
            [51] => No
        )

    [3] => Array
        (
            [0] => 15305
            [1] => 25-04445-36722
            [2] => pod69
            [3] => mart badger
            [4] => martsemailddr34@gmail.com
            [5] => 
            [6] => Via Riccione N. 35/30
            [7] => 
            [8] => Sa Tiacca Quartu S. Elena
            [9] => CA
            [10] => 09445
            [11] => Italy
            [12] => Badger Mart
            [13] => +39 987 654 3211
            [14] => Via Riccione N. 35/30
            [15] => 
            [16] => Sa Tiacca Quartu S. Elena
            [17] => CA
            [18] => 09445
            [19] => Italy
            [20] => 302667176336
            [21] => 2x Funny Car & Van or Camper WV Eyelash Vinyl Sticker Decal, Signs - Any Colour!
            [22] => 
            [23] => No
            [24] => 2
            [25] => £1.99
            [26] => £3.14
            [27] => 
            [28] => £0.00
            [29] => £0.00
            [30] => £7.12
            [31] => No
            [32] => PayPal
            [33] => 23-Jan-20
            [34] => 23-Jan-20
            [35] => 24-Jan-20
            [36] => 
            [37] => 
            [38] => 24-Jan-20
            [39] => Yes
            [40] => 
            [41] => 
            [42] => 25C157351T6888860U
            [43] => Royal Mail International Standard
            [44] => 
            [45] => 1709118816020
            [46] => 
            [47] => No
            [48] => 
            [49] => No
            [50] => 
            [51] => No
        )

    [4] => Array
        (
            [0] => 15306
            [1] => 20-04482-41274
            [2] => wideboiy38887
            [3] => Paul Lastname
            [4] => wideboiysemail@hotmail.co.uk
            [5] => Yellow please
            [6] => 10
            [7] => Broomstick Lane
            [8] => Okehampton
            [9] => Devon
            [10] => EX19 2FT
            [11] => United Kingdom
            [12] => Paul Lastname
            [13] => +44 7866 401983
            [14] => 105
            [15] => Broomstick Lane
            [16] => Okehampton
            [17] => Devon
            [18] => EX19 2FT
            [19] => United Kingdom
            [20] => 302755568952
            [21] => Junglist Soldier Car Window Laptop Wall Gift Drum Bass dnb Jungle Vinyl Sticker
            [22] => 
            [23] => No
            [24] => 1
            [25] => £1.99
            [26] => £0.00
            [27] => 
            [28] => £0.00
            [29] => £0.00
            [30] => £1.99
            [31] => No
            [32] => PayPal
            [33] => 01-Feb-20
            [34] => 01-Feb-20
            [35] => 03-Feb-20
            [36] => 
            [37] => 
            [38] => 
            [39] => No
            [40] => 
            [41] => 
            [42] => 7SD68673EE789782X
            [43] => Royal Mail 1st Class
            [44] => 
            [45] => 1711667179020
            [46] => 
            [47] => No
            [48] => 
            [49] => No
            [50] => 
            [51] => No
        )

    <!-And so on.....>

Я надеюсь, что это имеет смысл, и это то, что я думаю, мне нужно.

Чего я пытаюсь добиться, так это сделать «для каждого l oop» для каждого массива верхнего уровня, чтобы я мог создать страницу счета-фактуры, где я мог бы использовать каждый массив верхнего уровня как отдельная страница счета / заказа в разметке html для этой страницы.

Ответы [ 3 ]

2 голосов
/ 16 марта 2020

Пожалуйста, попробуйте следующий код. Это работает.

<?php
    function readCSV($csvFile)
    {
        $line_of_text = [];
        $file_handle = fopen($csvFile, 'r');
        while (!feof($file_handle)) {
            $tmp = fgetcsv($file_handle, 1024);

            if (isset($line_of_text[$tmp[0]])) {
                foreach ($tmp as $k => $v) {

                    if (array_key_exists($k, $line_of_text[$tmp[0]])) {
                        if (!is_array($line_of_text[$tmp[0]][$k])) {
                            $kVal = $line_of_text[$tmp[0]][$k];

                            $line_of_text[$tmp[0]][$k] = [];
                            $line_of_text[$tmp[0]][$k][] = $kVal;
                        }

                        $line_of_text[$tmp[0]][$k][] = $v;
                        $line_of_text[$tmp[0]][$k] = array_unique($line_of_text[$tmp[0]][$k]);
                        $line_of_text[$tmp[0]][$k] = array_filter($line_of_text[$tmp[0]][$k]);

                        if (count($line_of_text[$tmp[0]][$k]) == 1) {
                            $line_of_text[$tmp[0]][$k] = array_values($line_of_text[$tmp[0]][$k]);
                            $line_of_text[$tmp[0]][$k] = $line_of_text[$tmp[0]][$k][0];
                        }

                        if (empty($line_of_text[$tmp[0]][$k])) {
                            $line_of_text[$tmp[0]][$k] = null;
                        }

                    } else {
                        $line_of_text[$tmp[0]][$k] = null;
                    }
                }
                $line_of_text[$tmp[0]][0] = $tmp[0];

            } else {
                $line_of_text[$tmp[0]] = $tmp;
            }

        }

        fclose($file_handle);
        return array_filter(array_values($line_of_text));
    }

    // Set path to CSV file
    $csvFile = 'test.csv';
    $csv = readCSV($csvFile);

    echo "<pre>";
    print_r($csv);

?>

=> Вывод

Array
(
    [0] => Array
        (
            [0] => 15304
            [1] => 15-04478-27247
            [2] => ersmith0
            [3] => eric smith
            [4] => myemail@gmail.com
            [5] => 
            [6] => 2 Any Close
            [7] => 
            [8] => Manchester
            [9] => Greater Manchester
            [10] => M1 5BB
            [11] => United Kingdom
            [12] => eric smith
            [13] => +44 7719 123456
            [14] => 27 Any Close
            [15] => 
            [16] => Manchester
            [17] => Greater Manchester
            [18] => M1 5BB
            [19] => United Kingdom
            [20] => Array
                (
                    [0] => 302804801330
                    [1] => 302804815489
                )

            [21] => Array
                (
                    [0] => CAUTION DRIVEN BY A BIKER  - Fun Vinyl Decal Sticker 4x4/Car/Lorry/Van/Camper
                    [1] => Warning Biker With an Attitude Annoy At Your Own Risk Car Vinyl Decal Sticker
                )

            [22] => 
            [23] => No
            [24] => Array
                (
                    [0] => 2
                    [1] => 1
                )

            [25] => Array
                (
                    [0] => £3.90
                    [1] => £1.95
                )

            [26] => £0.00
            [27] => 
            [28] => £0.00
            [29] => £0.00
            [30] => £3.90
            [31] => No
            [32] => PayPal
            [33] => 30-Jan-20
            [34] => 30-Jan-20
            [35] => 
            [36] => 
            [37] => 
            [38] => 31-Jan-20
            [39] => No
            [40] => 
            [41] => 
            [42] => 5LD0123456789U
            [43] => Royal Mail 1st Class
            [44] => 
            [45] => Array
                (
                    [0] => 1711351782020
                    [1] => 1711351781020
                )

            [46] => 
            [47] => No
            [48] => 
            [49] => No
            [50] => 
            [51] => No
        )

    [1] => Array
        (
            [0] => 15305
            [1] => 25-04445-36722
            [2] => pod69
            [3] => mart badger
            [4] => martsemailddr34@gmail.com
            [5] => 
            [6] => Via Riccione N. 35/30
            [7] => 
            [8] => Sa Tiacca Quartu S. Elena
            [9] => CA
            [10] => 09445
            [11] => Italy
            [12] => Badger Mart
            [13] => +39 987 654 3211
            [14] => Via Riccione N. 35/30
            [15] => 
            [16] => Sa Tiacca Quartu S. Elena
            [17] => CA
            [18] => 09445
            [19] => Italy
            [20] => 302667176336
            [21] => 2x Funny Car & Van or Camper WV Eyelash Vinyl Sticker Decal, Signs - Any Colour!
            [22] => 
            [23] => No
            [24] => 2
            [25] => £1.99
            [26] => £3.14
            [27] => 
            [28] => £0.00
            [29] => £0.00
            [30] => £7.12
            [31] => No
            [32] => PayPal
            [33] => 23-Jan-20
            [34] => 23-Jan-20
            [35] => 24-Jan-20
            [36] => 
            [37] => 
            [38] => 24-Jan-20
            [39] => Yes
            [40] => 
            [41] => 
            [42] => 25C157351T6888860U
            [43] => Royal Mail International Standard
            [44] => 
            [45] => 1709118816020
            [46] => 
            [47] => No
            [48] => 
            [49] => No
            [50] => 
            [51] => No
        )

    [2] => Array
        (
            [0] => 15306
            [1] => 20-04482-41274
            [2] => wideboiy38887
            [3] => Paul Lastname
            [4] => wideboiysemail@hotmail.co.uk
            [5] => Yellow please
            [6] => 10
            [7] => Broomstick Lane
            [8] => Okehampton
            [9] => Devon
            [10] => EX19 2FT
            [11] => United Kingdom
            [12] => Paul Lastname
            [13] => +44 7866 401983
            [14] => 105
            [15] => Broomstick Lane
            [16] => Okehampton
            [17] => Devon
            [18] => EX19 2FT
            [19] => United Kingdom
            [20] => 302755568952
            [21] => Junglist Soldier Car Window Laptop Wall Gift Drum Bass dnb Jungle Vinyl Sticker
            [22] => 
            [23] => No
            [24] => 1
            [25] => £1.99
            [26] => £0.00
            [27] => 
            [28] => £0.00
            [29] => £0.00
            [30] => £1.99
            [31] => No
            [32] => PayPal
            [33] => 01-Feb-20
            [34] => 01-Feb-20
            [35] => 03-Feb-20
            [36] => 
            [37] => 
            [38] => 
            [39] => No
            [40] => 
            [41] => 
            [42] => 7SD68673EE789782X
            [43] => Royal Mail 1st Class
            [44] => 
            [45] => 1711667179020
            [46] => 
            [47] => No
            [48] => 
            [49] => No
            [50] => 
            [51] => No
        )

)
1 голос
/ 18 марта 2020

Вы можете обрабатывать массив следующим образом:

$arr = [];
//$csv is your array
foreach($csv as $key => $value){
  $arr[$value[0]][] = $value;  
}
print_r($arr);

этот код добавит все вложенные массивы с тем же [0] -ым индексом.

, затем вы можете использовать другие функции php для создания Ваш массив уникален.

Если вы хотите получить результат с объединенными массивами, попробуйте следующий код.

$arr = [];
//$csv is your array
foreach($csv as $key => $value){
  if(!array_key_exists($value[0],$arr)){
    $arr[$value[0]] = [];
  }
  $arr[$value[0]] = array_merge($arr[$value[0]],$value);  
}
print_r($arr);

Я не проверял код, поэтому, если есть, исправьте любую ошибку.

0 голосов
/ 18 марта 2020

Я думаю, что это может привести к чему-то другому, чем вам нравится, если может произойти следующая ситуация:

Допустим, у нас есть 3 записи, подобные этой:

$original = [0] => [
  [0] => 'id0',
  [1] => 'name 0',
  [2] => 'street 0'
],
[1] => [
  [0] => 'id0',
  [1] => 'name 1',
  [2] => 
],
[2] => [
  [0] => 'id0',
  [1] =>,
  [2] => 'street 2'
]

, в результате вы получите следующая структура, если я следую тому, что, как я думаю, вы имеете в виду:

$new = [0] => [
  [0] => 'id0',
  [1] => [
    [0] => 'name 0',
    [1] => 'name 1'
  ],
  [2] => [
    [0] => 'street 0',
    [1] => 'street 2'
  ]
]

вы можете видеть, что $ new [0] [1] [1] от $ original [1] [1], в то время как на та же позиция в массиве $ new [0] [2] [1] происходит из $ original [2] [2]

Я думаю, проблема в том, что вы теперь выравниваете $ original [X] [1] с $ original [X] [2], если вы печатаете это в какой-то таблице / обзоре, они оказываются рядом друг с другом, но не связаны между собой.

==

Что касается того, как Чтобы решить вашу проблему, я бы предложил что-то вроде этого:

function readCsv($csvFileName) {
    $file_handle = fopen($csvFile, 'r');
    $records = [];
    fgetcsv($file_handle);
    while (!feof($file_handle) ) {
        $line = fgetcsv($file_handle, 1024);
        $id = $line[0];
        if (!$records[$id]) $records[$id] = [];
        $records[$id][] = $line;
    }
    fclose($file_handle);
    return $records;
}

function printCsvColumn($rowName, $sales) {
    $uniqueSales = array_unique($sales);
    $uniqueNotNullSales = array_filter($uniqueSales, 'strlen');
    foreach ($uniqueNotNullSales as $sale) {
        echo $rowName . ': ' . $sale[$rowName];
    }
}

function printCsv($records) {
    foreach ($records as $sales) {
        foreach ($sales[0] as $rowName=>$rowValue) {
            printCsvColumn($rowName, $sales);
        }
    }
}

Если вы знаете OOP, вы можете создавать классы и объекты, представляющие эту логику c, так что вы не получите этот функционал. и итерации данных по всему вашему коду.

...