У меня есть файл, который выглядит так:
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']
]
Если бы это был мой проект, я бы, вероятно, занялся подготовкой необходимых значений при извлечении данных из файла. Я буду использовать $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',
),
)
Других решений пока нет …