![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Необходимо перевести код работы с массивом из PHP на Delphi
PHP код:
PHP код:
А как сделать подобное на Delphi? Код:
? Пробовал TDictionary, но там не допускаются дубли ключей, на ПХП же они являются ключами множества $files['qaz1.txt'][] С записями тоже не совсем понятно как это провернуть. Цитата:
Последний раз редактировалось Admin, 03.02.2022 в 22:57. |
|
#2
|
|||
|
|||
|
Ну так и делай. Собственно, как известно, многомерные массивы в Delphi это вложенные одномерные массивы. Указание нескольких индексов это просто синтаксический сахар.
Соответсвенно. Если ты хочешь иметь доступ по первому индексу по ключу, а далее по индексу, то храни в TDictionary массив: Код:
uses System.Generics.Collections;
type
TA = Array Of String;
procedure TForm1.Button1Click(Sender: TObject);
var
MyMap : TDictionary<String,TDictionary<String,TA>>;
a : TDictionary<String,TA>;
begin
MyMap := TDictionary<String,TDictionary<String,TA>>.Create;
a := TDictionary<String,TA>.Create;
a.Add('1',['10','20']);
MyMap.Add('товар1',a);
end;Должно работать. Ну с поправкой на то, что надо использовать соотв. методы TDictuonary. В принципе, можно написать свой класс-враппер, что бы упростить синтакс. Что-то типа: Код:
type
TMyMap = class
private
FMyMap : TDictionary<String,TDictionary<String,Array Of String>>;
public
constructor Create;
destructor Destroy; override;
function Get(Key1 : String; Key2 : String) : Array Of String;
procedure Set(Key1 : Stringl Key2 : String; Values : Array Of String);
end;
...
var
MyMap : TMyMap;
begin
MyMap := TMyMap.Create;
MyMap.Set('товар1','0',['10','20']);
MyMap.Set('товар1','1',['30','40']);Можно использовать вложенные объекты. Тогда можно воспольщоваться индесным свойством и объявить его по умолчанию. Тогда синтакс упростится до использования квадратных скобок. Последний раз редактировалось lmikle, 04.02.2022 в 04:58. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Admin (04.02.2022)
| ||
|
#3
|
||||
|
||||
|
Цитата:
Наваял пример, однако осталось не совсем понятно, как получить число дочерних элементов например товара 1, и как их перебрать в цикле. Код:
var
key: string;
MyFiles: TDictionary<String,TDictionary<Integer,TA>>;
fl: TDictionary<Integer,TA>;
begin
MyFiles := TDictionary<String,TDictionary<Integer,TA>>.Create;
fl := TDictionary<Integer,TA>.Create;
fl.Add(0, ['120','20']);
fl.Add(1, ['10','20']);
fl.Add(2, ['10','20']);
MyFiles.Add('Товар 1', fl);
fl.Free;
fl := TDictionary<Integer,TA>.Create;
fl.Add(0, ['15','25']);
fl.Add(1, ['15','25']);
MyFiles.Add('Товар 2', fl);
fl.Free;
{fl := TDictionary<Integer,TA>.Create;
fl.Add(3, ['20','30']);
MyFiles.Add('Товар 1', fl);
fl.Free;}
Memo1.Lines.Clear;
Memo1.Lines.Add('Items count: ' + IntToStr(MyFiles.Count));
if MyFiles.ContainsKey('Товар 1') then
begin
Memo1.Lines.Add('Objecs count: ' + IntToStr(MyFiles['Товар 1'].Count));
// Memo1.Lines.Add('Objecs count: ' + IntToStr(MyFiles.Items['Товар 1'].Keys.Count));
fl := TDictionary<Integer,TA>.Create;
fl := MyFiles['Товар 1'];
Memo1.Lines.Add('"Товар 1" оjecs count: ' + IntToStr(fl.Count));
fl.Free;
Memo1.Lines.Add('');
for key in MyFiles.Keys do
Memo1.Lines.Add(key + ': ' + IntToStr(MyFiles[key].Count));
end;
MyFiles.Free;
end;Используя Count также получаю что-то несуразное для дочерних элементов первого товара. Цитата:
Да и закоментированный "fl.Add(3, ['20','30']);" - у меня есть рекурсия - сканирование папок, в них файлы, так вот все дочерние элементы добавляются не за один раз, а при каждом проходе. Пока до этого не дошел даже. PHP код:
|
|
#4
|
|||
|
|||
|
Да там, вроде, не count надо использовать, а получать коллекцию ключей и уже у нее брать count. или использовать новый систаксит for each.
|
|
#5
|
||||
|
||||
|
Последний раз редактировалось Admin, 23.02.2022 в 16:45. |