Статьи

Введение в структуры данных в ColdFusion

Я знаю, что это любимая тема каждого. Это, безусловно, первая глава, которую я ищу, когда получаю новую книгу « Изучай <вставь язык здесь>» в 2-х минутах

Ну ладно — может и нет. Но ужасная правда в том, что структуры данных лежат в основе нашего существования как разработчиков. Независимо от того, создаете ли вы сценарий оболочки для запуска в * nix-боксе или полноценное настольное приложение Windows, вам понадобятся структуры данных какого-либо типа.

Любой, кто даже кратко посмотрел на ColdFusion, вероятно, видел самые основные структуры данных, переменные. Переменные обычно устанавливаются так:

<cfset myVariable = \"This is my variable.\"> 

То, что не испытали многие люди, это сила более продвинутых структур данных ColdFusion. Это нормально, хотя, потому что в этой и следующей статьях я собираюсь познакомить вас с массивами и структурами ColdFusion (или «структурами», как они называются в CF).

Массивы

Мы начнем с обсуждения того, как ColdFusion обрабатывает массивы. Если вы разрабатывали программное обеспечение на любом другом языке, вы, несомненно, знакомы с массивами и их различным использованием. Если нет, то все в порядке — я объясню их здесь.

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

   <cfset fruit = \"apple\"> 

Теперь у вас есть фрукт, это яблоко. Большой! Вы переходите к апельсину:

   <cfset fruit = \"orange\"> 

Подождите! Теперь у вас есть один фрукт — апельсин, но без яблок. Это потому, что со вторым <cfset> вы перезаписали «яблоко» на «апельсин». Итак, как мы можем описать все наши фрукты, но при этом сохранить их в той же категории: фрукты? Ну, мы используем массив для этого:

   <cfset fruit = ArrayNew(1)> 

Это создает массив с именем fruit . Он использует функцию ArrayNew , которая принимает один параметр, который должен быть целым числом. Для тех из вас, кто знаком с другими языками программирования (например, Visual Basic), этот параметр обманчив. Параметр здесь не определяет, сколько элементов будет содержать ваш массив, но сколько измерений он будет иметь. Прежде чем говорить больше об измерениях, давайте продолжим с одним массивом измерений. Теперь, когда мы создали этот, мы можем добавить к нему наши фрукты:

   <cfset fruit[1] = \"apple\">  <cfset fruit[2] = \"orange\">  <cfset fruit[3] = \"banana\"> 

Отлично! Теперь мы перечислили всю нашу вазу с фруктами под одним именем переменной, поэтому мы можем легко отслеживать ее. Давайте рассмотрим это немного дальше. Прежде всего, в ColdFusion массивы все динамические. Это означает, что ColdFusion не требует, чтобы вы заранее сообщали ему, сколько элементов будет иметь ваш массив (это требуется для других языков, таких как Java). Во-вторых, индексирование массива начинается с 1, а не с 0. Языки, такие как Java и C ++, начинают указанный массив с установки fruit[0] = "apple" .

Теперь поговорим об отображении массива. Это действительно очень просто. Мы будем использовать <cfloop> и функцию ArrayLen .

   <cfloop from=\"1\" to=\"#ArrayLen(fruit)#\" index=\"i\">    <cfoutput>#i# = #fruit[i]#<br></cfoutput>  </cfloop> 

Это не так сложно, не так ли? Эти три строки кода просто выводят содержимое массива, по одному элементу на строку. Обратите внимание, как вы получаете доступ к каждому элементу, используя i в конце имени переменной. Здесь происходит то, что мы начинаем наш цикл с 1, присваивая это значение переменной i. Затем мы отображаем позицию, в которой мы находимся в данный момент, а затем получаем доступ к fruit[1] и отображаем его. Затем он увеличивает i до 2, отображает переменные и так далее, пока i не станет равным длине массива.

Для всех вас, Java / C ++ кодеров, мы зациклились на фактической длине массива, а не на длине минус один. В Java это приведет к исключению массива за пределы границ, поскольку индексирование начинается с 0 и продолжается до минус единицы.

Многомерные массивы

Для тех из вас, кто не знаком с массивами, каждое значение, хранящееся в массиве, называется элементом. Каждый элемент может представлять собой данные практически любого типа: переменную (целое число, строку, логическое значение и т. Д.), Структуру или другой массив. Если у вас есть массив, содержащий элемент, содержащий другой массив, то у вас есть многомерный массив. Просто имейте в виду, что если вы создаете многомерный массив, такой как двумерный массив, первое измерение может содержать только другие массивы, а не фактические текстовые данные (то есть строки или целые числа).

Например, давайте рассмотрим массив фруктов, который мы создали выше. Теперь мы хотим отслеживать цвета каждого фрукта. Для этого мы будем отслеживать наши цвета в многомерном массиве. Это будет выглядеть так:

   <cfset colors = ArrayNew(2)>  <cfset colors[1][1]  = \"green\">  <cfset colors[1][2] = \"red\">  <cfset colors[1][3] = \"yellow\">  <cfset colors[2][1] = \"orange\">  <cfset colors[3][1] = \"yellow\">  <cfset colors[3][2] = \"green\"> 

Это может выглядеть довольно сложно, но на самом деле это не так. Все, что мы делаем, это:

  1. определение двумерного массива
  2. присвоение значений второму измерению каждого массива

Итак, вот поп-викторина: сколько у нас массивов? Ответ: четыре. Существует массив с именем colors, который содержит три других массива, называемых colors[1] , colors[2] и colors[3] . Мы обрабатываем каждый из трех последних массивов так же, как мы делали массив фруктов, присваивая значения индексам. Теперь мы можем отобразить цвета для каждого фрукта следующим образом:

 <cfloop from=\"1\" to=\"#ArrayLen(colors)#\" index=\"outer\">    <cfoutput><b>#outer# = #fruit[outer]#</b></cfoutput>    <blockquote>      <cfloop from=\"1\" to=\"#ArrayLen(colors[outer])#\" index=\"inner\">        <cfoutput>#inner# - #colors[outer][inner]#</cfoutput>      </cfloop>    </blockquote>  </cfloop> 

Здесь мы делаем цикл по массиву верхнего уровня (первое измерение) и отображаем имя фрукта (из массива фруктов). Предупреждение: это не очень хорошая идея. Фрукты могут иметь меньше размеров, чем цвета. Это только для демонстрационных целей.

Реальная жизнь

Если вы не создадите очень простую подставку для электронных фруктов, приведенные выше примеры не дадут вам много времени, когда вы попытаетесь использовать массивы в реальной жизни. Вот пример того, как я иногда использую массивы.

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

 <cfparam name="selectmonth" default="1">  <cfset months = ArrayNew(1)>  <cfloop from="1" to="#DateFormat("12/31/2003", "mm")#" index="j">  <cfset months[j] = DateFormat("#j#/1/2003", "mmmm")>  </cfloop> 

Код выше гарантирует, что январь будет выбранным месяцем. Вы можете использовать для этого переменную URL или Form, в зависимости от вашего приложения. Затем мы создаем цикл, начинающийся с 1 и заканчивающийся на 12. Обратите внимание, мы используем последний день года и DateFormat() его в DateFormat() чтобы получить только номер месяца, или 12. Затем мы присваиваем каждому индексу от 1 до 12 с названием месяца. Итак, когда мы вызываем DateFormat («01.05.2003», «мммм»), он получает дату 1 мая 2003 года, а затем просто вытаскивает название месяца. Теперь мы покажем наше поле выбора:

 <select name="month">  <cfloop from="1" to="#ArrayLen(months)#" index="i">    <cfif selectmonth eq i>      <option value="#i#" selected>#months[i]#</option>    <cfelse>      <option value="#i#">#months[i]#</option>    </cfif>  </cfloop>  </select> 

Это переходит от начального индекса массива к конечному индексу, чтобы создать раскрывающийся список. Он проверяет, был ли выбран текущий месяц, и помечает его как таковой при необходимости. Это так просто! Вы можете просто скопировать и вставить код, чтобы создать раскрывающийся список там, где вам это нужно.

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

В нашей следующей статье мы подробно обсудим структуры (или структуры) ColdFusion, так что не пропустите!