|
7 | 7 | */
|
8 | 8 |
|
9 | 9 | // Define constants.
|
10 |
| -define('FIELDS', ['EMAIL', 'CARD', 'PHONE']); |
| 10 | +define('DUPLICATES_FIELDS', ['EMAIL', 'CARD', 'PHONE']); |
11 | 11 |
|
12 | 12 | // Default example data.
|
13 | 13 | $csv = 'ID,PARENT_ID,EMAIL,CARD,PHONE,TMP
|
14 | 14 | 1,NULL,email1,card1,phone1,
|
15 | 15 | 2,NULL,email2,card1,phone2,
|
16 | 16 | 3,NULL,email3,card3,phone3,
|
17 |
| -4,NULL,email1,card2,phone4, |
| 17 | +4,NULL,email1,card2,phone4, |
18 | 18 | 5,NULL,email5,card5,phone2,
|
19 | 19 | 6,NULL,email6,card6,phone6,
|
20 | 20 | 7,NULL,email3,card9,phone7,
|
21 | 21 | 8,NULL,email8,card10,phone8,
|
22 |
| -9,NULL,email9,card9,phone3, |
23 |
| -10,NULL,email10,card10,phone10,'; |
| 22 | +9,NULL,email9,card9,phone3, |
| 23 | +10,NULL,email2,card10,phone10,'; |
24 | 24 |
|
25 | 25 | $rows = explode(PHP_EOL, $csv);
|
| 26 | +$fields_array = []; |
26 | 27 |
|
27 | 28 | // Prepare array data.
|
28 | 29 | foreach ($rows as $key => $row) {
|
|
41 | 42 | $csv_string = 'ID,PARENT_ID' . PHP_EOL;
|
42 | 43 |
|
43 | 44 | $mapping_fields = [];
|
| 45 | +$grouping_key = []; |
44 | 46 |
|
45 | 47 | // Find duplicates and save to mapping.
|
46 | 48 | foreach ($fields_array as $key => $array) {
|
|
51 | 53 | }
|
52 | 54 |
|
53 | 55 | // Set default value for each iteration.
|
54 |
| - $group = NULL; |
| 56 | + $group = $group_key = NULL; |
55 | 57 | $group_to_merge = [];
|
56 | 58 |
|
57 | 59 | // Grouping by fields.
|
58 |
| - foreach (FIELDS as $field) { |
| 60 | + foreach (DUPLICATES_FIELDS as $field) { |
59 | 61 | $field_value = $array[$field];
|
60 | 62 | if (array_key_exists($array[$field], $mapping_fields)) {
|
61 |
| - $group = $mapping_fields[$field_value]; |
62 |
| - $group_to_merge[] = $group; |
| 63 | + $group_key = $mapping_fields[$field_value]; |
| 64 | + $group_to_merge[] = $group_key; |
63 | 65 | }
|
64 | 66 | }
|
65 | 67 |
|
66 |
| - // Setting minimal group if have more one group ID. |
67 |
| - if (count($group_to_merge) > 1) { |
68 |
| - $group = min($group_to_merge); |
| 68 | + // Setting group if do not have any duplicates. |
| 69 | + if ($group_key === NULL) { |
| 70 | + $grouping_key[] = $array['ID']; |
| 71 | + $group_key = array_search($array['ID'], $grouping_key); |
69 | 72 | }
|
| 73 | + $group = $grouping_key[$group_key]; |
70 | 74 |
|
71 |
| - // Setting group if do not have any duplicates. |
72 |
| - if ($group === NULL) { |
73 |
| - $group = $array['ID']; |
| 75 | + // Setting minimal group if have more one group ID. |
| 76 | + if (count($group_to_merge) > 1) { |
| 77 | + for ($i = 0; $i < count($group_to_merge); $i++) { |
| 78 | + $merging_array[] = $grouping_key[$group_to_merge[$i]]; |
| 79 | + } |
| 80 | + if (!empty($merging_array)) { |
| 81 | + $group = min($merging_array); |
| 82 | + $group_key = array_search($group, $grouping_key); |
| 83 | + } |
74 | 84 | }
|
75 | 85 |
|
76 | 86 | // Save fields to mapping.
|
77 |
| - $mapping_fields[$array['EMAIL']] = $group; |
78 |
| - $mapping_fields[$array['CARD']] = $group; |
79 |
| - $mapping_fields[$array['PHONE']] = $group; |
| 87 | + $mapping_fields[$array['EMAIL']] = $group_key; |
| 88 | + $mapping_fields[$array['CARD']] = $group_key; |
| 89 | + $mapping_fields[$array['PHONE']] = $group_key; |
80 | 90 |
|
81 | 91 | }
|
82 | 92 |
|
|
85 | 95 | if ($key === 0) {
|
86 | 96 | continue;
|
87 | 97 | }
|
88 |
| - // Searching PARENT_ID by email field. May be any field (like: CARD, PHONE). |
89 |
| - $fields_array[$key]['PARENT_ID'] = $mapping_fields[$array['EMAIL']]; |
| 98 | + |
| 99 | + $parent_ids = NULL; |
| 100 | + // Searching PARENT_ID by fields. |
| 101 | + foreach (DUPLICATES_FIELDS as $field) { |
| 102 | + $parent_ids[] = $grouping_key[$mapping_fields[$array[$field]]]; |
| 103 | + } |
| 104 | + $fields_array[$key]['PARENT_ID'] = min($parent_ids); |
90 | 105 |
|
91 | 106 | // Prepare data from csv.
|
92 | 107 | if ($key !== 0) {
|
|
0 commit comments