Генерация уникальных идентификаторов для всех значений столбцов в многомерном массиве

У меня есть файл, который выглядит так:

Papiers peints > 3D et Perspective > 3D
Papiers peints > Carte du monde
Papiers peints > Fleurs
Papiers peints > Fleurs > Coquelicots
Tableaux > Cartes du monde
Tableaux > Fleurs
Tableaux > Fleurs > Coquelicots

и который я затем преобразовать в правильно отформатированный CSV, как это:

"Papiers peints","3D et Perspective","3D""Papiers peints","Carte du monde",
"Papiers peints","Fleurs",
"Papiers peints","Fleurs","Coquelicots""Tableaux","Cartes du monde",
"Tableaux","Fleurs",
"Tableaux","Fleurs","Coquelicots"

Мне нужно, чтобы каждое из этих полей имело свой уникальный идентификатор, который должен быть целым числом. Вот так это должно выглядеть

"Papiers peints",101,"3D et Perspective",1001,"3D",10001
"Papiers peints",101,"Carte du monde",1002,,
"Papiers peints",101,"Fleurs",1003,,
"Papiers peints",101,"Fleurs",1003,"Coquelicots",10002
"Tableaux",102,"Cartes du monde",1004,,
"Tableaux",102,"Fleurs",1005,,
"Tableaux",102,"Fleurs",1005,"Coquelicots",10003

Сами имена не имеют значения вообще, и всегда будут дубликаты.
Я могу решить это легко, загрузив в базу данных.
Тогда я делаю:

  • select distinct COL1, дать им свои идентификаторы
  • select COL2, group by COL1, COL2, дать им свои идентификаторы
  • select COL3, group by COL1, COL2,COL3, дать им свои идентификаторы
  • повторить столько раз, сколько необходимо, что может быть довольно много

Как мне сделать это в PHP без использования базы данных?
Прямой ответ был бы хорош, но даже идея дизайна очень помогла бы.

В моем файле может быть до 10 столбцов, но вот упрощенный входной массив для работы:

$new=[0=>['a0','a1','a2','a3'],1=>['b0','b1','b2','b3'],2=>['c0','c1','c2','c3'],3=>['d0','d1','d2','d3'],4=>['e0','e1','e2','e3']];

Ожидаемый результат:

[
['a0','101','a1','1001','a2','10001','a3','100001'],
['b0','102','b1','1002','b2','10002','b3','100002'],
['c0','103','c1','1003','c2','10003','c3','100003'],
['d0','104','d1','1004','d2','10004','d3','100004'],
['e0','105','e1','1005','e2','10005','e3','100005']
]

2

Решение

Если бы это был мой проект, я бы, вероятно, занялся подготовкой необходимых значений при извлечении данных из файла. Я буду использовать $new массив в качестве входных данных (я изменил несколько значений во время тестирования).

Код (демонстрация):

$new=[0=>['a0','a1','a2','a3'],1=>['a0','b1','b2','b3'],2=>['c0','b1','c2','c3'],3=>['d0','d1','c2','d3'],4=>['e0','e1','e2','f3']];

// OP says could be up to 10 columns...
for($x=0; $x<10; ++$x){
$index_base=pow(10,2+$x)+1;         // or replace pow() with ** if php >=5.6
// echo $x," : ",$index_base,"\n";  // uncomment if you want to see the values created
$unique_col_val_keys[$x]=
array_map(
function(&$v)use($index_base){  // &$v means modify the input array's values
return $v+$index_base;    // update the incremented ids (values) using $index_base
},
// the following 4 functions generate the input array to map
array_flip(                   // swap keys and values within the array
array_values(             // reset keys
array_unique(         // remove duplicate column values
array_column(
$new,$x       // get set of values from each column of multi-dim array
)
)
)
)
);
}
//var_export($unique_col_val_keys);  // uncomment if you want to see the generated indexes

foreach($new as $row=>$a){
if(!isset($result[$row])){$result[$row]=[];}
foreach($a as $col=>$v){
// echo "$row $col $v : {$unique_col_val_keys[$col][$v]}\n";
array_push($result[$row],$v,"{$unique_col_val_keys[$col][$v]}");
}
}
var_export($result);

Выход:

array (
0 =>
array (
0 => 'a0',
1 => '101',
2 => 'a1',
3 => '1001',
4 => 'a2',
5 => '10001',
6 => 'a3',
7 => '100001',
),
1 =>
array (
0 => 'a0',
1 => '101',
2 => 'b1',
3 => '1002',
4 => 'b2',
5 => '10002',
6 => 'b3',
7 => '100002',
),
2 =>
array (
0 => 'c0',
1 => '102',
2 => 'b1',
3 => '1002',
4 => 'c2',
5 => '10003',
6 => 'c3',
7 => '100003',
),
3 =>
array (
0 => 'd0',
1 => '103',
2 => 'd1',
3 => '1003',
4 => 'c2',
5 => '10003',
6 => 'd3',
7 => '100004',
),
4 =>
array (
0 => 'e0',
1 => '104',
2 => 'e1',
3 => '1004',
4 => 'e2',
5 => '10004',
6 => 'f3',
7 => '100005',
),
)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]