Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевести код работы с массивом из PHP на Delphi / 9 сообщений из 9, страница 1 из 1
06.02.2022, 00:04
    #40131961
SiteAnalyzer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести код работы с массивом из PHP на Delphi
Необходимо перевести код работы с массивом из PHP на Delphi
Код: php
1.
2.
3.
$files['qaz1.txt'][] = array('20kb,' 'readonly');
$files['qaz1.txt'][] = array('30kb,' 'archive');
$files['qaz1.txt'][] = array('40kb,' 'readonly');


Т.е. на PHP мы можем очень просто получить значение 30кб: $d = $files['qaz1.txt'][1][0];

А как сделать подобное на Delphi?

Мне вот как так нужно

[товар1][0] = array('10', '20')
[товар1][1] = array('15', '30')
[товар1][2] = array('12', '10')

[товар2][0] = array('11', '20')
[товар2][1] = array('25', '30')
[товар2][2] = array('32', '10')

ну в крайнем случае так, но это избыточно

[0][0] = array('name1', '')
[0][1] = array('10', '20')
[0][2] = array('15', '30')
[0][3] = array('12', '10')

[1][0] = array('name2', '')
[1][1] = array('10', '20')
[1][2] = array('15', '30')
[1][3] = array('12', '10')
Пробовал TDictionary, но возникли трудности: не совсем понятно, как получить число дочерних элементов например товара 1, и как их перебрать в цикле.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
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 также получаю что-то несуразное для дочерних элементов первого товара.

Items count: 2
Objecs count: 16
"Товар 1" оjecs count: 0

Товар 1: 0
Товар 2: 0
Да и закоментированный "fl.Add(3, ['20','30']);" - у меня есть рекурсия - сканирование папок, в них файлы, так вот все дочерние элементы добавляются не за один раз, а при каждом проходе. Пока до этого не дошел даже.

Код: php
1.
2.
3.
4.
5.
6.
if(mb_strpos($dir."/".$v, '/Фото/'))
$files[$shk][] = array($dir."/".$v, '[Фото]', $shk, $category);
else
if(mb_strpos($dir."/".$v, '/Инфографика/'))
$files[$shk][] = array($dir."/".$v, '[Инфографика]', $shk, $category);
else
...
Рейтинг: 0 / 0
06.02.2022, 01:23
    #40131966
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести код работы с массивом из PHP на Delphi
SiteAnalyzer
Необходимо перевести код работы с массивом из PHP на Delphi
Код: php
1.
2.
3.
$files['qaz1.txt'][] = array('20kb,' 'readonly');
$files['qaz1.txt'][] = array('30kb,' 'archive');
$files['qaz1.txt'][] = array('40kb,' 'readonly');


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
type
  TFileInfo = record
    Size: string;
    Attr: string;
    constructor Create(const ASize, AAttr: string);
  end;

constructor TFileInfo.Create(const ASize, AAttr: string);
begin
  Size := ASize;
  Attr := AAttr;
end;

var
  files: TObjectDictionary<string, TList<TFileInfo>>;
begin
  files := TObjectDictionary<string, TList<TFileInfo>>.Create([doOwnsValues]);
  try
    files.Add('qaz1.txt', TList<TFileInfo>.Create);
    files['qaz1.txt'].Add(TFileInfo.Create('20kb', 'readonly');
    files['qaz1.txt'].Add(TFileInfo.Create('30kb', 'archive');
    files['qaz1.txt'].Add(TFileInfo.Create('40kb', 'readonly');
  finally
    files.Free;
  end;
end;
...
Рейтинг: 0 / 0
06.02.2022, 03:01
    #40131973
SiteAnalyzer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести код работы с массивом из PHP на Delphi
_Vasilisk_

type
TFileInfo = record
Size: string;
Attr: string;
constructor Create(const ASize, AAttr: string);
end;...
Круто, добавление вот прямо работает на ура! Остались пара вопросов:

Мой тестовый пример:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
var
  key: string;
  files: TObjectDictionary<string, TList<TFileInfo>>;
begin
  files := TObjectDictionary<string, TList<TFileInfo>>.Create([doOwnsValues]);

  files.Add('qaz1.txt', TList<TFileInfo>.Create);

  files['qaz1.txt'].Add(TFileInfo.Create('20kb', 'readonly'));
  files['qaz1.txt'].Add(TFileInfo.Create('30kb', 'archive'));
  files['qaz1.txt'].Add(TFileInfo.Create('40kb', 'readonly'));

  files.Add('qaz2.txt', TList<TFileInfo>.Create);

  files['qaz2.txt'].Add(TFileInfo.Create('33kb', 'archive3'));

  files['qaz1.txt'].Add(TFileInfo.Create('44kb', 'readonly4'));

  files.Add('qaz3.txt', TList<TFileInfo>.Create);

  files['qaz3.txt'].Add(TFileInfo.Create('34kb', 'archive3'));

  files.Add('qaz4.txt', TList<TFileInfo>.Create);

  files['qaz4.txt'].Add(TFileInfo.Create('35kb', 'archive3'));
  files['qaz4.txt'].Add(TFileInfo.Create('35kb', 'archive3'));
  files['qaz4.txt'].Add(TFileInfo.Create('35kb', 'archive3'));

  files.Add('qaz5.txt', TList<TFileInfo>.Create);

  files['qaz5.txt'].Add(TFileInfo.Create('36kb', 'archive3'));

  files['qaz3.txt'].Add(TFileInfo.Create('37kb', 'archive3'));
  files['qaz4.txt'].Add(TFileInfo.Create('39kb', 'archive2'));

  files.Add('qaz77.txt', TList<TFileInfo>.Create);

  files['qaz77.txt'].Add(TFileInfo.Create('77kb', 'archive77'));

  Memo1.Lines.Add('Все файлы: ' + IntToStr(files.Count));
  Memo1.Lines.Add('qaz4.txt: ' + IntToStr(files['qaz4.txt'].Count));

  if files.ContainsKey('qaz3.txt') then
  begin
    Memo1.Lines.Add('');

    for key in files.Keys do
    begin
      Memo1.Lines.Add(key + ': ' + IntToStr(files[key].Count));
    end;
  end;

  files.Free;
end;

Почему-то список файлов выдает в таком порядке:

авторqaz4.txt: 4
qaz2.txt: 1
qaz77.txt: 1
qaz1.txt: 4
qaz3.txt: 2
qaz5.txt: 1
Т.е. не по порядку их добавления в массив, а непонятно как отсортировано, как-будто рандом.

И второе: не понятно как теперь вывести полученный массив в тот же Memo.

На всякий случай пример на ПХП для понимания:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
$files = array();

$files['Товар 1'][] = array('/folder_1/path_1/t.jpg', '[Фото]');
$files['Товар 1'][] = array('/folder_1/path_777/g.jpg', '[Видео]');
$files['Товар 2'][] = array('/folder_2/path_2/n.jpg', '[Фото]');
$files['Товар 3'][] = array('/folder_3/path_33/p.txt', '[Описание]');
$files['Товар 1'][] = array('/folder_1/path_1/n.jpg', '[Фото]');
$files['Товар 2'][] = array('/folder_2/path_1111/q.txt', '[Описание]');
$files['Товар 567'][] = array('/folder_xxx/path_yyy/zzz.txt', '[Описание]');

print_r($files);

Array
(
    [Товар 1] => Array
        (
            [0] => Array
                (
                    [0] => /folder_1/path_1/t.jpg
                    [1] => [Фото]
                )
            [1] => Array
                (
                    [0] => /folder_1/path_777/g.jpg
                    [1] => [Видео]
                )
            [2] => Array
                (
                    [0] => /folder_1/path_1/n.jpg
                    [1] => [Фото]
                )
        )
    [Товар 2] => Array
        (
            [0] => Array
                (
                    [0] => /folder_2/path_2/n.jpg
                    [1] => [Фото]
                )
            [1] => Array
                (
                    [0] => /folder_2/path_1111/q.txt
                    [1] => [Описание]
                )
        )
    [Товар 3] => Array
        (
            [0] => Array
                (
                    [0] => /folder_3/path_33/p.txt
                    [1] => [Описание]
                )
        )
    [Товар 567] => Array
        (
            [0] => Array
                (
                    [0] => /folder_xxx/path_yyy/zzz.txt
                    [1] => [Описание]
                )
        )
)

фото "/folder_1/path_777/g.jpg" -> echo $files['Товар 1'][1][0];
...
Рейтинг: 0 / 0
06.02.2022, 14:29
    #40132022
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести код работы с массивом из PHP на Delphi
SiteAnalyzer
Т.е. не по порядку их добавления в массив, а непонятно как отсортировано, как-будто рандом.
Да. TDictionary не сохраняет порядок добавления. Для сохранения порядка нужно прикладывать дополнительные усилия.
SiteAnalyzer
И второе: не понятно как теперь вывести полученный массив в тот же Memo.
Код: pascal
1.
2.
3.
4.
5.
for LPair in files do begin
  Memo.Lines.Add(LPair.Key);
  for LInfo in LPair.Value do
    Memo.Lines.Add(Format('%s, %s', [LInfo.Size, LInfo.Attr]));
end;
...
Рейтинг: 0 / 0
06.02.2022, 17:43
    #40132079
SiteAnalyzer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести код работы с массивом из PHP на Delphi
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
for LPair in files do begin
  Memo.Lines.Add(LPair.Key);
  for LInfo in LPair.Value do
    Memo.Lines.Add(Format('%s, %s', [LInfo.Size, LInfo.Attr]));
end;


Добавил

Код: pascal
1.
2.
3.
var
  LPair: TPair<String,TDictionary<Integer,TA>>;
  LInfo: TDictionary<Integer,TA>;


Но ругается на

автор Memo1.Lines.Add(Format('%s, %s', [LInfo.Size, LInfo.Attr]));
.Size и .Attr, хотя вроде все верно
...
Рейтинг: 0 / 0
06.02.2022, 23:03
    #40132122
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести код работы с массивом из PHP на Delphi
SiteAnalyzer
Добавил

Код: pascal
1.
2.
3.
var
  LPair: TPair<string, TList<TFileInfo>>;
  LInfo: TFileInfo;
...
Рейтинг: 0 / 0
06.02.2022, 23:31
    #40132130
SiteAnalyzer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести код работы с массивом из PHP на Delphi
_Vasilisk_, спасибо, вроде все работает как нужно

Остался вопрос на счет сортировки - хотелось бы без лишних наворотов, хотя бы сортировку в том виде как добавляются товары.
Есть ли готовые решения или примеры как это исправить?

Нагуглил вариант - https://stackoverflow.com/questions/31256891/sorting-tdictionary-by-a-key-of-integer-in-ascending-order
Но применить к моему коду - сходу не вышло
...
Рейтинг: 0 / 0
06.02.2022, 23:47
    #40132132
SiteAnalyzer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести код работы с массивом из PHP на Delphi
Код: pascal
1.
2.
  LArray := files.Keys.ToArray;
  TArray.Sort<string>(LArray);



Дальше я так понимаю уже по нему как-то нужно цикл сделать, а не по files.
...
Рейтинг: 0 / 0
08.02.2022, 00:10
    #40132379
SiteAnalyzer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести код работы с массивом из PHP на Delphi
_Vasilisk_
TDictionary не сохраняет порядок добавления. Для сохранения порядка нужно прикладывать дополнительные усилия

И хотелось бы иметь сортировку в том порядке, в каком файлы добавляются в массив, прочие (убывание, возрастание) не нужны
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевести код работы с массивом из PHP на Delphi / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]