Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

web - tec / PHP 5 для начинающи

.pdf
Скачиваний:
69
Добавлен:
12.06.2015
Размер:
26.79 Mб
Скачать

Логические операторы, циклы и массивы 193

Рис. 4.8.

Рис. 4.9.

Как это работает

Описанная задача не настолько проста, как может показаться на первый взгляд. Программа начинается с простой формы, запрашивающей у пользователя число. Данное число передается сценарию как переменная $number.

Сколько у Вас детей?

<input name="number" type="text">

194 Глава 4

Рис. 4.10.

Затем в PHP+сценарии используется небольшой трюк. После того как программа обнаруживает, что форма была отправлена (проверив с помощью функции isset() существование переменной $_POST[posted]), браузеру отправляется тег <form> как часть оператора echo. По сути, программа, таким образом, сообщает браузеру, что необходимо создать форму:

if (isset($_POST['posted'])) {

echo "<form method='POST' action='dynamic.php'>";

В форме необходимо создать определенное количество текстовых полей ++++++ столь+ ко, сколько указал пользователь на предыдущей странице; это число хранится в пере+ менной $_POST[number]. Это идеальное время для начала цикла for. Необходимо отобразить несколько текстовых полей, количество которых соответствует значению переменной $_POST[number], но если у пользователя нет детей, то отображать тек+ стовые поля вообще не следует. Это означает, что счетчик $counter должен начи+ наться с нуля, и если значение $_POST[number] равно нулю, то необходимо прервать цикл. Итак, счетчик начинается с нуля и увеличивается на единицу в конце каждой итерации. Цикл продолжается до тех пор, пока значение счетчика меньше, чем коли+ чество детей ($_POST[number]):

for ($counter = 0; $counter < $_POST['number']; $counter ++){

Внутри цикла есть проблема. Необходимо обозначить каждое текстовое поле с по+ мощью какого+либо номера, а, кроме того, если для этого использовать текущий счет+ чик цикла, то номер текстового поля будет на единицу меньше, чем должен быть. Чтобы обойти это препятствие, создается переменная смещения, значение которой равно $counter плюс один:

$offset = $counter + 1;

Затем отображается сообщение, приглашающее пользователя ввести имя ребенка:

echo "<br>Введите имя $offset-го ребенка<br>";

Логические операторы, циклы и массивы 195

Затем добавляется текстовое поле. Здесь примечательно то, что когда для тексто+ вого поля устанавливается атрибут name, к имени текстового поля добавляются квад+ ратные скобки, что означает создание массива. Поэтому каждый раз при передаче имени в $_POST[‘child’] имя сохраняется в новом элементе данного массива: $_POST[‘child’][0], $_POST[‘child’][1], $_POST[‘child’][2] и т.д.:

echo "<input name='child[]' type='text'>";

}

Здесь цикл фактически заканчивается. В каждой итерации цикла (количество ите+ раций определяется переменной $number) просто отображается сопроводительный текст и текстовое поле. После выхода из цикла программа отображает кнопку отправ+ ки данных, вставляет еще одно скрытое поле формы с именем posted01, для того чтобы можно было определить вторую отправку формы, и, наконец, закрывает форму.

echo"<br>Для продолжения нажмите кнопку<br>"; echo "<input type='submit' value='Далее'>";

echo "<input type='hidden' name='posted01' value='true'></form>";

Второй блок кода, который активизируется isset()+проверкой переменной $_POST[posted01], распечатывает имена из массива. На первый взгляд это просто, однако прежде всего необходимо учитывать, что переменная $number не была пере+ дана в новый сценарий. Она существовала только при отображении предыдущей страницы. Поэтому возникает ситуация, когда известны имена, переданные в массив $_POST[child][], но неизвестно их количество. Значит можно прибегнуть к уже из+ вестному циклу do while. Необходимо вручную установить счетчик имен детей $count, начиная с нуля, так как имен может не быть.

} else {

if (isset($_POST['posted01'])) {

$count=0;

echo "Имена Ваших детей:";

Затем начинается цикл do while, поскольку код цикла должен быть выполнен, по крайней мере, один раз:

do{

На входе в цикл отображается первый элемент массива, $_POST[child][0]. Если в массиве нет элементов, то выводится только разрыв строки. Иначе отображается имя первого ребенка:

echo"<br><b>$_POST['child'][$count]</b>";

Переменной $checkempty присваивается значение элемента $child[0]. Если данный элемент массива пуст, то $checkempty позднее приведет к прерыванию цик+ ла. Если первое имя существует, то цикл повторяется снова.

$checkempty = "$_POST['child'][$count]";

Увеличивается счетчик:

$count = $count + 1;

Выполняется проверка переменной $checkempty. Если она пуста, то цикл преры+ вается, иначе цикл продолжается:

} while ($checkempty != "");

Затем выполняется проверка введенного количества детей. Если число не было введено, то отображается соответствующее сообщение:

if ($count == 1) {

echo "Введите другое число";

}

}

196 Глава 4

Циклы являются мощным средством в программировании. Предположим, в данной программе пользователь ввел бы число 20. Без использования циклов в программе при+ шлось бы использовать 20 строк для считывания имен и 20 строк для их вывода. Кроме того, без циклов теряется динамичность, так как приходится фиксировать число счи+ тываемых полей с именами; циклы позволяют создавать более динамический код.

Массивы

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

$states_of_the_USA[1] = "Washington"; $states_of_the_USA[2] = "California";

Так как индексные номера являются числовыми значениями, использовать кавыч+ ки для указания индекса не требуется.

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

$states_of_the_USA [49]="Alaska"; $states_of_the_USA [13]="Alabama";

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

$state_capital["CA"] = "Sacramento"; $state_capital["IL"] = "Springfield";

Для того чтобы получить доступ к элементам ассоциативного массива, использо+ вать кавычки вокруг имен элементов необязательно. Например, чтобы вывести на Web+странице слово Sacramento, можно использовать такой код:

echo $state_capital["CA"];

или

echo $state_capital[CA];

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

Следует также упомянуть об одной особенности массивов в PHP ++++++ разным элемен+ там одного массива можно присваивать различные типы данных и значения пере+ менных, например:

$number[1]=24; $number[2]="двадцать три";

$number[2]=$variable; $number["CA"]=$variable;

Однако при этом возникает ряд вопросов. Как PHP определяет, каким должен быть размер массива? Сколько памяти следует выделить для данного массива? Ответы на эти вопросы вы найдете в последующих разделах.

Логические операторы, циклы и массивы 197

Инициализация массивов

Инициализацией массива называется установка первоначальных значений пере+ менных массива. В данной книге уже рассматривались два способа инициализации массивов (создание переменной массива путем именования и присвоения ей значе+ ния). Первый способ: программисту не приходится беспокоиться об индексации, PHP делает все автоматически. Создается один элемент массива, а затем создается другой элемент с тем же именем:

$author[]="Вильям Шекспир"; $author[]="Франц Кафка";

Без квадратных скобок PHP не сможет определить, что необходимо оперировать массивом, и просто заменит первое значение вторым. Скобки указывают на то, что значения необходимо сохранять в массиве. Пропуск индексного значения позволяет PHP самостоятельно решать, куда помещать переменные. Если массив $author[] ра+ нее не использовался, то значения в данном примере будут сохранены в элементах $author[0] и $author[1]. PHP позаботится о присвоении новых значений следую+ щим элементам массива.

Второй способ инициализации массива заключается в явном указании индексов:

$author[0]="Вильям Шекспир"; $author[1]="Франц Кафка";

В данном случае необязательно подчиняться ограничениям автоматической нумера+ ции, которые в противном случае создает PHP; можно назначать индексы не по порядку. Что касается массивов, то PHP отличается от многих языков программирования в двух аспектах. Во+первых, не требуется предопределять тип данных массива, указывая на то, что массив будет содержать числа или текст. Это соответствует политике PHP в отно+ шении переменных: программисту не обязательно выбирать тип данных переменной; PHP делает это автоматически. Во+вторых, также не требуется указывать размер массива до его создания, потому что PHP определяет максимальный индексный номер массива.

Существует еще два способа наполнения массивов в PHP, и в обоих используется конструкция array (). При первом способе значения присваиваются непосредст+ венно без указания индексов или элементов массива. Например, фрагмент кода с соз+ данием массива авторов можно переопределить следующим образом:

$author = array ("Вильям Шекспир", "Франц Кафка");

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

щую строку:

$states_of_the_USA = array ("Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming");

PHP автоматически сгенерирует индексы. Первый штат при этом получит индекс равный нулю, а штат Вайоминг (Wyoming) будет иметь индекс 49.

Однако это может показаться несколько нелогичным; известно, что в США входит 50 штатов, и если последний штат получает номер 49, то можно ошибочно предполо+ жить, что один штат потерян. Второй способ создания переменной массива с помощью

198 Глава 4

функции array() позволяет обойти эту проблему. Для этого используется оператор =>, позволяющий выбрать индекс, с которого следует начинать отсчет:

$states_of_the_USA = array (1 => "Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming");

Иными словами, необходимо ввести индексное значение, с которого следует начи+ нать индексацию, и оператор =>, а затем как обычно перечислить значения массива. Теперь, если вывести значение элемента $states_of_the_USA[50], то на странице появится слово ‘‘Wyoming’’. Необязательно использовать в качестве начального индекса единицу; можно начинать с индекса 101, и тогда штат Вайоминг получит индекс 150.

Если необходимо проиндексировать крупный ассоциативный массив, то придется устанавливать каждое значение отдельно. В таком случае в коде также используется оператор =>. Например:

$states_of_the_USA = array ("al" => "Alabama", "ak" => "Alaska", "az" => "Arizona", "ar" => "Arkansas", "ca" => "California", "co" => "Colorado", "ct" => "Connecticut", "de" => "Delaware", "fl" => "Florida", "ga" => "Georgia", "hi" => "Hawaii", "id" => "Idaho", "il" => "Illinois", "in" => "Indiana", "ia" => "Iowa", "ks" => "Kansas", "ky" => "Kentucky", "la" => "Louisiana", "me" => "Maine", "md" => "Maryland", "ma" => "Massachusetts", "mi" => "Michigan", "mn" => "Minnesota", "ms" => "Mississippi", "mo" => "Missouri", "mt" => "Montana", "ne" => "Nebraska", "nv" => "Nevada", "nh" => "New Hampshire", "nj" => "New Jersey", "nm" => "New Mexico", "ny" => "New York", "nc" => "North Carolina", "nd" => "North Dakota", "oh" => "Ohio", "ok" => "Oklahoma", "or" => "Oregon", "pa" => "Pennsylvania", "ri" => "Rhode Island", "sc" => "South Carolina", "sd" => "South Dakota", "tn" => "Tennessee", "tx" => "Texas", "ut" => "Utah", "vt" => "Vermont", "va" => "Virginia", "wa" => "Washington", "wv" => "West Virginia", "wi" => "Wisconsin", "wy" => "Wyoming");

Медленно, но задача индексации решается.

Итерации в массиве

Если создан массив с большим количеством элементов, то нежелательно возвра+ щаться назад и по отдельности извлекать каждый элемент массива. Для этого потре+ буется большая дополнительная работа. Облегчить эту работу позволяют циклы. Что+ бы на Web+странице отобразить названия всех 50 штатов, можно просто использовать цикл for. Для отображения всех 50 штатов, проиндексированных от 1 до 50 в массиве $states_of_the_USA, в конечном итоге придется использовать три строки кода, не считая строку создания массива:

for ($counter=1; $counter<51; $counter++) { echo"<BR>$states_of_the_USA[$counter]";

}

Код в фигурных скобках выбирает элемент массива $states_of_the_USA с помощью переменной $counter, которая используется в качестве индекса. Так как $counter явля+ ется переменной, индекс можно изменять, меняя значение данной переменной. Дан+ ный цикл for можно описать так: ‘‘Начать цикл с 1 и продолжать до 50, увеличивая счетчик на единицу’’. Таким образом, переменная $counter замещается значениями 1, 2, 3 и т.д. для каждой итерации (разрыв строки (<br>) используется для того, чтобы выводить каждый штат в новой строке):

Логические операторы, циклы и массивы 199

echo"<br>$states_of_the_USA[1]; echo"<br>$ states_of_the_USA[2];

echo"<br>$ states_of_the_USA[3];

и т.д.

Ничто не мешает использовать циклы while или do while, хотя для этого придет+ ся самостоятельно создать счетчик цикла и присваивать ему значения. Следующий цикл while делает то же, что и цикл for:

$counter = 1;

while ($counter < 51) {

echo"<br> $states_of_the_USA[$counter]"; $counter = $counter + 1;

}

Для этого требуется всего пара лишних строк.

Рассмотрим практический пример обработки массивов с помощью циклов.

Практика Итерация в массиве

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

1. Откройте HTML+редактор и введите следующий код:

<html>

<head><title></title></head>

<body>

<?php

if (isset($_POST['posted'])) {

$state_capital = array (0 => "Montgomery", "Juneau", "Phoenix", "Little Rock", "Sacramento","Denver","Hartford", "Dover","Tallahasse", "Atlanta", "Honolulu", "Boise", "Springfield","Indianapolis", "Des Moines", "Topeka", "Frankfort", "Baton Rouge","Augusta","Annapolis","Boston", "Lansing", "Saint Paul","Jackson", "Jefferson City", "Helena","Lincoln", "Carson City","Concord", "Trenton","Santa Fe", "Albany", "Raleigh", "Bismarck","Columbus","Oklahoma City", "Salem", "Harrisburg", "Providence", "Columbia","Pierre", "Nashville", "Austin","Salt Lake City", "Montpelier", "Richmond","Olympia","Charleston", "Madison","Cheyenne");

for ($counter=0; $counter<50; $counter++)

{

if($_POST['hiddenstate'][$counter]==$_POST['state'])

{

echo "Столица штата $_POST[state] - <b>$state_capital[$counter]</b><hr>";

}

}

}

?>

<form action="capitals.php" method="POST">

<input type="hidden" name="posted" value="true">

Выберите штат, название столицы которого Вы хотели бы узнать

<select name="state"> <?php

$states_of_the_USA = array (1 => "Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota",

200 Глава 4

"Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming");

for ($counter = 1; $counter < 51; $counter ++) {

echo "<option>$states_of_the_USA[$counter]</option>";

}

echo "</select><br><br>";

for ($counter = 1; $counter < 51; $counter++) { echo"<input type='hidden' name='hiddenstate[]'

value='$states_of_the_USA[$counter]'>";

}

?>

<input type="submit" value="Найти столицу"> </form>

</body>

</html>

2.Сохраните данный файл как capitals.php и закройте его.

3.Откройте созданный файл в браузере и выберите какой+либо штат.

4.Нажмите кнопку Найти столицу. На рис. 4.11 показан ответ для пользователя, который выбрал штат Гавайи (Hawaii).

Рис. 4.11.

Как это работает

Данный пример демонстрирует то, насколько компактный код можно писать с по+ мощью циклов и массивов.

В примере первая страница была создана как PHP+сценарий, чтобы можно было ис+ пользовать функцию array() и, таким образом, избежать необходимости вводить 50 строк HTML+кода в списке <select>. Страница начинается с создания HTML+формы:

Логические операторы, циклы и массивы 201

<form action="capitals.php" method="POST">

<input type="hidden" name="posted" value="true">

Выберите штат, название столицы которого Вы хотели бы узнать

Затем создается выпадающий список:

<select name="state">

Названия штатов помещены в массив $states_of_the_USA, начиная с индекса 1:

<?php

$states_of_the_USA = array (1 => "Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming");

Создается цикл для 50 итераций, помещающий название каждого штата в выпа+ дающий список:

for ($counter = 1; $counter < 51; $counter ++) { echo"<option>$states_of_the_USA[$counter]</option>";

}

echo "</select><br><br>";

Когда этот цикл заканчивается, список закрывается. Можно было бы предполо+ жить, что в следующей строке вставляется кнопка отправки данных и форма закрыва+ ется. Однако, забегая вперед, можно заметить проблему: все штаты должны быть дос+ тупны не только на данной странице, но и на следующей. Почему? Рассмотрим поиск столицы определенного штата. Сначала, в массиве $states_of_the_USA необхо+ димо найти индекс штата, а затем найти столицу данного штата, название которой хранится с тем же индексом в массиве $state_capital. Например, значением элемента $states_of_the_USA[1] является строка ‘‘Alabama’’, поэтому значение $state_capital[1] ++++++ ‘‘Montgomery’’. Это возможно, поскольку массивы были соз+ даны так, чтобы гарантировать, что индекс столицы определенного штата в массиве $state_capital соответствует индексу штата в массиве $states_of_the_USA. Иными словами, данные в двух массивах согласованы по индексу.

Теперь, если передать следующему сценарию только название штата из списка без его индекса в $states_of_the_USA, то невозможно будет найти соответствующий индекс в массиве $state_capital, а, следовательно, не удастся найти столицу вы+ бранного штата.

Как можно решить данную проблему? Очевидно, в следующий сценарий необхо+ димо передать некоторую информацию об индексе штата, поэтому в данном примере в следующий сценарий передается весь массив штатов.

Необходимо создать второй цикл и использовать его для создания массива, содер+ жащего 50 скрытых полей формы $_POST['hiddenstate']. Затем следует запол+ нить этот массив названиями штатов из массива $states_of_the_USA.

for ($counter = 1; $counter < 51; $counter++) { echo"<input type='hidden' name='hiddenstate[]'

value='$states_of_the_USA[$counter]'>";

}

После этого добавляется кнопка отправки запроса и форма закрывается:

<input type="submit" value="Найти столицу"> </form>

202 Глава 4

Теперь в программе имеется два набора данных. Первый получен из выпадающего списка и содержит название одного штата, выбранного пользователем. Эта информа+ ция хранится в переменной $state. Второй набор данных ++++++ список из 50 штатов в алфавитном порядке, сохраненный в массиве $hiddenstate. (Поскольку данный массив заполняется PHP автоматически, индексные номера начинаются с 0 и закан+ чиваются значением 49. Это не проблема; просто это следует иметь в виду. Первая стро+ ка сделает все, что нужно.) Теперь следует создать массив с названиями столиц 50 шта+ тов. Чтобы индексы данного массива соответствовали индексам $hiddenstate, необходимо начать индексацию с нуля:

$state_capital = array (0 => "Montgomery", "Juneau", "Phoenix", "Little Rock", "Sacramento","Denver","Hartford", "Dover","Tallahasse", "Atlanta", "Honolulu", "Boise", "Springfield","Indianapolis", "Des Moines", "Topeka", "Frankfort", "Baton Rouge","Augusta","Annapolis","Boston", "Lansing", "Saint Paul","Jackson", "Jefferson City", "Helena","Lincoln", "Carson City","Concord", "Trenton","Santa Fe", "Albany", "Raleigh","Bismarck","Columbus","Oklahoma City", "Salem", "Harrisburg", "Providence", "Columbia","Pierre", "Nashville", "Austin","Salt Lake City", "Montpelier","Richmond","Olympia","Charleston", "Madison","Cheyenne");

Теперь массивы $hiddenstate и $state_capital согласованы по индексу, что значительно упрощает остальную часть программы. Фактически потребуется один цикл со счетчиком от 0 до 49:

for ($counter=0; $counter<50; $counter++)

{

Внутри данного цикла имеется вложенный условный оператор, который прове+ ряет совпадение текущего штата со штатом, выбранным пользователем. Если они совпадают, то на Web+странице отображается содержимое соответствующего элемен+ та $state_capital:

if($_POST['hiddenstate'][$counter]==$_POST['state'])

{

echo"Столица штата $_POST[state] - <b>$state_capital[$counter]</b><hr>";

}

}

Если значения не совпадают, то цикл for продолжается. Использование выпа+ дающего списка обеспечивает конечное число вариантов, поэтому известно, что сов+ падение всегда найдется. Это все что требуется сделать в программе.

Усовершенствование программы

Предыдущая программа получилась не настолько простой, насколько она могла бы быть. Авторы намеренно пошли на это, чтобы показать, как два отдельных массива могут быть связаны по индексу. Гораздо проще было бы использовать ассоциативный массив, в котором элементы массива создаются с помощью следующей строки кода:

$state_capital = array ("Alabama" => "Montgomery", "Alaska" => "Juneau", "Phoenix" =>"Arizona", "Arkansas" => "Little Rock", "California" => "Sacramento", "Colorado" => "Denver", "Connecticut" => "Hartford", "Delaware" => "Dover", "Florida" => "Tallahasse", "Georgia" => "Atlanta", "Hawaii" => "Honolulu", "Idaho" => "Boise", "Illinois" => "Springfield",

"Indiana" => "Indianapolis", "Iowa" => "Des Moines", "Kansas" => "Topeka", "Kentucky" => "Frankfort", "Louisiana" => "Baton Rouge","Maine" => "Augusta", "Maryland" => "Annapolis", "Massachusetts" => "Boston", "Michigan" => "Lansing", "Minnesota" => "Saint Paul", "Mississippi" => "Jackson", "Missouri" => "Jefferson City", "Montana" => "Helena", "Nebraska" => "Lincoln", "Nevada" => "Carson City", "New Hampshire" => "Concord", "New Jersey" => "Trenton", "New Mexico" => "Santa Fe", "New York" => "Albany", "North Carolina" => "Raleigh",

Соседние файлы в папке web - tec