powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевести код работы с массивом из PHP на Delphi
9 сообщений из 9, страница 1 из 1
Перевести код работы с массивом из PHP на Delphi
    #40131961
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');


Т.е. на 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
Перевести код работы с массивом из PHP на Delphi
    #40131966
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевести код работы с массивом из PHP на Delphi
    #40131973
SiteAnalyzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Перевести код работы с массивом из PHP на Delphi
    #40132022
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевести код работы с массивом из PHP на Delphi
    #40132079
SiteAnalyzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Перевести код работы с массивом из PHP на Delphi
    #40132122
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiteAnalyzer
Добавил

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

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

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



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

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


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