Ключ массива в структуре ColdFusion - PullRequest
2 голосов
/ 19 июля 2010

Каков правильный синтаксис для создания ключа в структуре ColdFusion, которая является массивом? Желательно в тегах cfscript.

Чтобы дать более четкое представление о том, что я пытаюсь сделать, я подумал, что это может быть:

StructInsert(account[i], "child[numChildren]", z);

где "child" должен был быть массивом, а numChildren - счетчиком в цикле.

Очевидно, это не работает. Это просто дает мне сообщение о том, что ключ "child [numChildren]" уже существует.

Ответы [ 3 ]

8 голосов
/ 19 июля 2010

Вы говорите, что структура "account" называется child, которая является массивом. Это не имеет никакого смысла. Если «child» - это массив, он не может быть структурой. Если это структура, она не может быть массивом. Массив может содержать структуры, а структуры могут содержать массивы.

Структура - это карта или хеш, другими словами, она состоит из пар имя-значение. Массив - это набор или список значений. Вы можете зациклить их или получить к ним доступ через их числовой индекс.

Давайте сделаем учетную запись структурой, а потом - массивом.

<cfset Account = structNew() />
<cfset Account.Child = ArrayNew(1) />

Account - это структура, поэтому вы можете использовать для нее функции struct (structKeyExists, structInsert).
Account.Child - это массив, поэтому вы можете использовать для него функции массива (arrayAppend и т. Д.). Account.Child, будучи массивом, может содержать практически любое значение в записи, включая сложные значения. Итак, давайте сделаем Account.Child массивом структур.

скажем, z в вашем примере - это структура, которая выглядит примерно так:

<cfset z = structNew() />
<cfset z.id = 1 />
<cfset z.name = "James" />

Вы можете добавить это в Account.Child следующим образом:

<cfset ArrayAppend(account.child,z) />

Или вы можете сделать это напрямую через индекс:

<cfset account.child[numChildren] = z />

СЕЙЧАС. Допустим, вы хотите сохранить Account в структуре, но вы хотите иметь 1 ключ для каждого дочернего элемента в структуре, а не использовать массив. Вы можете сделать это с помощью динамического ключа, например:

<cfset Account["child_#numChildren#"] = z />

К вашему сведению, structInsert, как правило, является ненужной функцией.

1 голос
/ 19 июля 2010

Мне не совсем понятно, что вы пытаетесь сделать, но если вы хотите создать дочерний элемент, который является массивом внутри структуры, вы должны сделать следующее:

var s = StructNew();
StructInsert(a, "ArrayName", ArrayNew(1))
a.ArrayName[10] = "Value for index 10";

StructInsertпринимает следующие аргументы: (структура, ключ, значение).См. Эту документацию Adobe для получения дополнительной информации: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f02.html

1 голос
/ 19 июля 2010

Если вы хотите, чтобы она была переменной, удалите кавычки, в противном случае ключ - это строка.

Хотя трудно определить, что вы пытаетесь сказать:

Account[i][ child[numChildren] ] = z

против

Account[i]['child'][numChildren] = z

или что-то еще.

Обновление:

Хорошо, поэтому, исходя из вашего комментария, вы, вероятно, захотите следующее:

Account.Child[numChildren] = z;

Что будет внутри цикла с индексом numChildren,где-то после следующих утверждений:

Account = StructNew();
Account.Child = ArrayNew(1);

(Вы также можете использовать Account['Child'] вместо Account.Child обозначения.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...