Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.02.2022, 22:46
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,537
Версия Delphi: Delphi 7
Репутация: выкл
Лампочка TDictionary - перевести код работы с массивом из PHP на Delphi

Необходимо перевести код работы с массивом из PHP на Delphi

PHP код:
$files['qaz1.txt'][] = array('20kb,' 'readonly');
$files['qaz1.txt'][] = array('30kb,' 'archive');
 
$files['qaz1.txt'][] = array('40kb,' 'readonly'); 
Т.е. на PHP мы можем очень просто получить значение 30кб:

PHP код:
$d $files['qaz1.txt'][1][0]; 

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

Код:
?


Пробовал TDictionary, но там не допускаются дубли ключей, на ПХП же они являются ключами множества $files['qaz1.txt'][]


С записями тоже не совсем понятно как это провернуть.


Цитата:
Мне вот как-то так нужно

[товар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')

Последний раз редактировалось Admin, 03.02.2022 в 22:57.
Ответить с цитированием
  #2  
Старый 04.02.2022, 02:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,788
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну так и делай. Собственно, как известно, многомерные массивы в 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  
Старый 04.02.2022, 18:51
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,537
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от lmikle
Ну так и делай...

Наваял пример, однако осталось не совсем понятно, как получить число дочерних элементов например товара 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 также получаю что-то несуразное для дочерних элементов первого товара.

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

Товар 1: 0
Товар 2: 0

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

PHP код:
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 
Ответить с цитированием
  #4  
Старый 05.02.2022, 20:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,788
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да там, вроде, не count надо использовать, а получать коллекцию ключей и уже у нее брать count. или использовать новый систаксит for each.
Ответить с цитированием
  #5  
Старый 23.02.2022, 03:08
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,537
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Доработанный исходник TDictionary https://delphisources.ru/pages/sourc...ictionary.html


Последний раз редактировалось Admin, 23.02.2022 в 16:45.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram