Журнал LinuxFormat - перейти на главную

LXF154:PHP

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Мас­си­вы внут­ри мас­си­вов)
Строка 136: Строка 136:
 
*World Championships: 1 LXF154.codephp.syntax.opt
 
*World Championships: 1 LXF154.codephp.syntax.opt
  
[[Файл:LXF154.codephp.syntax.opt.jpg |thumb|400px|Бла­го­да­ря ре­дак­то­ру ко­да со встро­ен­ной про­вер­кой син­так­си­са (ти­па Eclipse, по­бе­ди­те­ля Срав­не­ния IDE в LXF152/153), вы сэ­ко­но­ми­те вре­мя и из­бе­жи­те огор­че­ний!]]
+
[[Файл:LXF154.codephp.syntax.opt.jpg |thumb|420px|Бла­го­да­ря ре­дак­то­ру ко­да со встро­ен­ной про­вер­кой син­так­си­са (ти­па Eclipse, по­бе­ди­те­ля Срав­не­ния IDE в LXF152/153), вы сэ­ко­но­ми­те вре­мя и из­бе­жи­те огор­че­ний!]]
 
+
[[Файл:LXF154.code_php.f1cale_opt.jpeg|left|thumb|420px|Ка­лен­дарь «Фор­му­лы-1» 2012, ко­то­рый мы вос­соз­да­дим с на­шим ко­дом.]]
 
*Name: Lewis Hamilton
 
*Name: Lewis Hamilton
  
Строка 147: Строка 147:
  
 
Функ­ции foreach() нуж­ны два па­ра­мет­ра. Пер­вый – мас­сив, по ко­то­ро­му мы про­бе­га­ем. За­тем ис­поль­зу­ет­ся клю­че­вое сло­во PHP as, за­тем – имя вре­мен­ной пе­ре­мен­ной, ко­то­рой мы хо­тим при­сво­ить те­ку­щий эле­мент мас­си­ва (эта пе­ре­мен­ная доступ­на толь­ко внут­ри цик­ла). Бу­к­валь­но мы го­во­рим: прой­тись по всем эле­мен­там мас­си­ва $drivers и со­хранить ин­фор­ма­цию о ка­ж­дом во­ди­те­ле во вре­мен­ный мас­сив $driver.
 
Функ­ции foreach() нуж­ны два па­ра­мет­ра. Пер­вый – мас­сив, по ко­то­ро­му мы про­бе­га­ем. За­тем ис­поль­зу­ет­ся клю­че­вое сло­во PHP as, за­тем – имя вре­мен­ной пе­ре­мен­ной, ко­то­рой мы хо­тим при­сво­ить те­ку­щий эле­мент мас­си­ва (эта пе­ре­мен­ная доступ­на толь­ко внут­ри цик­ла). Бу­к­валь­но мы го­во­рим: прой­тись по всем эле­мен­там мас­си­ва $drivers и со­хранить ин­фор­ма­цию о ка­ж­дом во­ди­те­ле во вре­мен­ный мас­сив $driver.
 
+
{{Врезка|left|Заголовок=Скорая помощь |Ширина=15%|Содержание=
 +
Поль­зуй­тесь от­сту­па­ми там, где это воз­мож­но, так как они по­зво­лят тек­сту «струк­ту­ри­ро­вать­ся» и сде­лать код на странице бо­лее чи­тае­мым. В неко­то­рых тек­сто­вых ре­дак­то­рах от­сту­пы де­ла­ют­ся ав­то­ма­ти­че­­ски, но боль­шин­ст­во раз­ра­бот­чи­ков поль­зу­ют­ся ли­бо оди­ноч­ной та­бу­ля­ци­ей, ли­бо дву­мя-че­тырь­мя про­бе­ла­ми. }}
 
На­де­юсь, в этом при­ме­ре вам по­ка­жут­ся зна­ко­мы­ми неко­то­рые фраг­мен­ты из пре­ды­ду­ще­го ру­ко­во­дства; мы вы­во­дим стро­ку, скле­ен­ную из раз­лич­ных пе­ре­мен­ных – ка­ж­до­го по­ля с ин­фор­ма­ци­ей о во­ди­те­ле из мас­си­ва. За­тем мы склеи­ва­ем дру­гую стро­ку – это HTML-код, по­зво­ляю­щий нам вы­полнить об­щее фор­ма­ти­ро­вание вы­во­да. С по­следним эле­мен­том мас­си­ва $driver[‘championships’] мы вы­во­дим два пе­ре­но­са строк; это по­зво­ля­ет от­де­лить од­но­го во­ди­те­ля от дру­го­го.
 
На­де­юсь, в этом при­ме­ре вам по­ка­жут­ся зна­ко­мы­ми неко­то­рые фраг­мен­ты из пре­ды­ду­ще­го ру­ко­во­дства; мы вы­во­дим стро­ку, скле­ен­ную из раз­лич­ных пе­ре­мен­ных – ка­ж­до­го по­ля с ин­фор­ма­ци­ей о во­ди­те­ле из мас­си­ва. За­тем мы склеи­ва­ем дру­гую стро­ку – это HTML-код, по­зво­ляю­щий нам вы­полнить об­щее фор­ма­ти­ро­вание вы­во­да. С по­следним эле­мен­том мас­си­ва $driver[‘championships’] мы вы­во­дим два пе­ре­но­са строк; это по­зво­ля­ет от­де­лить од­но­го во­ди­те­ля от дру­го­го.
  
Строка 154: Строка 155:
 
В PHP есть два ти­па функ­ций:
 
В PHP есть два ти­па функ­ций:
  
245788.png
+
1. Встро­ен­ные функ­ции PHP, та­кие как date() и array_push().
1
+
2. Поль­зо­ва­тель­ские функ­ции.
Встро­ен­ные функ­ции PHP, та­кие как date() и array_push().
+
 
+
245813.png
+
2
+
Поль­зо­ва­тель­ские функ­ции.
+
 
+
 
Зай­мем­ся вто­рым ти­пом функ­ций (о несколь­ких встро­ен­ных функ­ци­ях PHP мы уже рас­ска­за­ли).
 
Зай­мем­ся вто­рым ти­пом функ­ций (о несколь­ких встро­ен­ных функ­ци­ях PHP мы уже рас­ска­за­ли).
  
Строка 187: Строка 182:
  
 
shout();
 
shout();
 +
{{Врезка|right|Заголовок=Важней­шие ре­сур­сы по PHP |Ширина=40%|Содержание=
 +
Изу­чению PHP по­свя­ще­но мно­же­ст­во книг, и час­то труд­но ска­зать, ка­кую (ка­кие) сто­ит вы­брать, что­бы они на­пра­ви­ли вас в вер­ном на­прав­лении. Хо­тя я не мо­гу вы­брать книги, ко­то­рые боль­ше по­дой­дут все­го лич­но вам, я мо­гу при­дать вам об­щее на­прав­ление с по­мо­щью от­лич­ных сай­тов по те­ме:
  
 +
*http://php.net Ос­нов­ной ре­сурс для все­го, свя­зан­но­го с PHP.
 +
 +
*http://php.net/manual/en/intro-whatcando.php Ощу­ти­те вкус то­го, что мож­но сде­лать с по­мо­щью PHP.
 +
 +
*http://phpsec.org/ Пре­крас­ный ре­сурс, осве­щаю­щий безо­пас­ность с PHP.
 +
 +
У ме­ня имеется не одна книга по PHP, но я интенсивно поль­зу­юсь он­лайн-до­ку­мен­та­ци­ей по PHP – час­то это бы­ст­рее, чем брать книгу и ис­кать в ней необ­хо­ди­мую страницу.
 +
 +
В по­ис­ках вдох­но­вения со­ве­тую прой­ти по вто­рой ссыл­ке – дай­те во­лю во­об­ра­жению и по­ду­май­те о том, что вы хо­те­ли бы сде­лать!
 +
 +
По­след­няя ссыл­ка важ­на тем, кто планиру­ет уста­нав­ли­вать PHP на доступ­ный из­вне web-сер­вер. Ус­та­но­ви­те скрипт, так как он даст вам неко­то­рые ба­зо­вые на­строй­ки, за­тем про­чти­те книгу и оз­на­комь­тесь с об­щи­ми под­хо­да­ми к безо­пас­но­сти.}}
 
Мы соз­да­ли ба­зо­вую функ­цию, но она все­го лишь воз­ра­щает то, что мы ей пе­ре­да­ли – до­воль­но бес­смыс­лен­но, кто б спо­рил. Пусть она де­ла­ет нечто по­ин­те­реснее. Соз­дай­те но­вый файл PHP, ско­пи­руй­те в него сле­дую­щий код и со­храните его под именем function.php:
 
Мы соз­да­ли ба­зо­вую функ­цию, но она все­го лишь воз­ра­щает то, что мы ей пе­ре­да­ли – до­воль­но бес­смыс­лен­но, кто б спо­рил. Пусть она де­ла­ет нечто по­ин­те­реснее. Соз­дай­те но­вый файл PHP, ско­пи­руй­те в него сле­дую­щий код и со­храните его под именем function.php:
  
Строка 208: Строка 216:
 
Внут­ри функ­ции мож­но пи­сать лю­бой код и вы­пол­нять лю­бые пре­об­ра­зо­вания строк.
 
Внут­ри функ­ции мож­но пи­сать лю­бой код и вы­пол­нять лю­бые пре­об­ра­зо­вания строк.
  
If() и else()
+
{{Врезка|right|Заголовок= На про­шлом уро­ке...|Ширина=98%|Содержание=
 +
Ес­ли вы про­пусти­ли пре­ды­ду­щую ста­тью, вот ряд основ­ных мо­мен­тов, ко­то­рые мы рас­смот­ре­ли:
 +
 
 +
В стан­дарт­ной вер­сии PHP бо­лее 1000 функ­ций, от про­стых – функ­ций да­ты и вре­мени, до бо­лее слож­ных – функ­ций для ра­бо­ты с LDAP и ба­за­ми дан­ных MySQL.
 +
 
 +
Весь код PHP (обыч­но) на­чи­на­ет­ся с ог­раничи­те­ля <?php и за­кан­чи­ва­ет­ся ог­раничи­те­лем ?>. PHP под­дер­жи­ва­ет мно­же­ст­во ти­пов дан­ных, та­ких как стро­ки, бу­лев­ские пе­ре­мен­ные, це­лые чис­ла, мас­си­вы, объ­ек­ты и др.
 +
 
 +
Пе­ре­мен­ные в PHP мо­гут со­дер­жать один фраг­мент дан­ных в один мо­мент вре­мени. Пе­ре­мен­ные на­чи­на­ют­ся с сим­во­ла $, за ко­то­рым сле­ду­ет имя пе­ре­мен­ной, ко­то­рое мо­жет на­чи­нать­ся толь­ко с бу­к­вы или сим­во­ла под­чер­ки­вания.
 +
 
 +
Ос­тав­шая­ся часть имени мо­жет содержать лю­бой набор букв, сим­во­лов под­чер­ки­вания или цифр; но она тем не менее яв­ля­ет­ся чув­ст­ви­тель­ной к ре­ги­ст­ру.
 +
 
 +
Встро­ен­ная функ­ция date() принима­ет бо­лее 35 вход­ных па­ра­мет­ров для точ­но­го пред­став­ления ре­зуль­та­та, и вы­пол­ня­ет­ся на сер­ве­ре, по­это­му воз­вра­ща­ет­ся вре­мя сер­ве­ра, а не вре­мя брау­зе­ра. PHP-скрипт мож­но за­пускать как от­дель­ный скрипт или как часть су­ще­ст­вую­ще­го шаб­ло­на, с по­мо­щью include(). }}
 +
 
 +
==If() и else()==
  
 
Вы за­ме­ти­те в на­шем ко­де кое-что еще... мы бу­дем вы­пол­нять про­вер­ку усло­вия опе­ра­то­ра­ми if() и else(). If/else да­ет про­стой спо­соб вы­брать код, ко­то­рый нуж­но вы­полнить, осно­вы­ва­ясь на ре­зуль­та­те оп­ре­де­лен­ной про­вер­ки или усло­вия. If() вы­пол­ня­ет­ся толь­ко в том слу­чае, ес­ли зна­чение в круг­лых скоб­ках рав­но (или воз­вра­ща­ет) TRUE, в про­тив­ном слу­чае вы­зы­ва­ет­ся блок else() – в ка­ж­дом слу­чае вы­пол­ня­ет­ся код в фи­гур­ных скоб­ках, но толь­ко в од­ном из бло­ков:
 
Вы за­ме­ти­те в на­шем ко­де кое-что еще... мы бу­дем вы­пол­нять про­вер­ку усло­вия опе­ра­то­ра­ми if() и else(). If/else да­ет про­стой спо­соб вы­брать код, ко­то­рый нуж­но вы­полнить, осно­вы­ва­ясь на ре­зуль­та­те оп­ре­де­лен­ной про­вер­ки или усло­вия. If() вы­пол­ня­ет­ся толь­ко в том слу­чае, ес­ли зна­чение в круг­лых скоб­ках рав­но (или воз­вра­ща­ет) TRUE, в про­тив­ном слу­чае вы­зы­ва­ет­ся блок else() – в ка­ж­дом слу­чае вы­пол­ня­ет­ся код в фи­гур­ных скоб­ках, но толь­ко в од­ном из бло­ков:
Строка 228: Строка 249:
 
Те­перь, ис­поль­зуя на­ши мас­си­вы и знания о функ­ци­ях, соз­да­дим ка­лен­дарь основ­ных со­бы­тий.
 
Те­перь, ис­поль­зуя на­ши мас­си­вы и знания о функ­ци­ях, соз­да­дим ка­лен­дарь основ­ных со­бы­тий.
  
Объ­е­ди­ня­ем все вме­сте
+
==Объ­е­ди­ня­ем все вме­сте==
  
 
Мы не бу­дем пе­ре­бар­щи­вать и по­ка соз­да­дим ка­лен­дарь за­ез­дов F1 на 2012 го­д. Пе­ре­да­дим се­го­дняш­нюю да­ту функ­ции и вернем те­ку­щий за­езд, ес­ли се­го­дня они есть, в про­тив­ном слу­чае вы­ве­дем об­щее со­об­щение.
 
Мы не бу­дем пе­ре­бар­щи­вать и по­ка соз­да­дим ка­лен­дарь за­ез­дов F1 на 2012 го­д. Пе­ре­да­дим се­го­дняш­нюю да­ту функ­ции и вернем те­ку­щий за­езд, ес­ли се­го­дня они есть, в про­тив­ном слу­чае вы­ве­дем об­щее со­об­щение.
Строка 292: Строка 313:
 
$date = ‘13/5/2012’;
 
$date = ‘13/5/2012’;
  
И с тем, за­кон­чим!
+
==И с тем, за­кон­чим!==
  
 
Вы уз­на­ли до­воль­но мно­го, ес­ли рань­ше не бы­ли зна­ко­мы с мас­си­ва­ми и функ­ция­ми, но, на­де­юсь, по­ня­ли, что все это очень важ­но в про­грам­ми­ро­ва­нии.
 
Вы уз­на­ли до­воль­но мно­го, ес­ли рань­ше не бы­ли зна­ко­мы с мас­си­ва­ми и функ­ция­ми, но, на­де­юсь, по­ня­ли, что все это очень важ­но в про­грам­ми­ро­ва­нии.
  
 
По­про­буй­те из­ме­нить ка­лен­дарь; мож­но быть бо­лее кон­крет­ным с да­та­ми и соз­дать со­бы­тия, ко­то­рые про­ис­хо­дят, на­при­мер, еже­днев­но. В ка­че­ст­ве уп­раж­не­ния взгля­ни­те на функ­цию date() и из­ме­ни­те ка­лен­дарь так, что­бы вы­во­ди­мые со­об­ще­ния ме­ня­лись в за­ви­си­мо­сти от те­ку­ще­го ча­са. Пом­ни­те, что вам по­тре­бу­ют­ся за­пи­си не для ка­ж­до­го дня – толь­ко для ка­ж­до­го ча­са.
 
По­про­буй­те из­ме­нить ка­лен­дарь; мож­но быть бо­лее кон­крет­ным с да­та­ми и соз­дать со­бы­тия, ко­то­рые про­ис­хо­дят, на­при­мер, еже­днев­но. В ка­че­ст­ве уп­раж­не­ния взгля­ни­те на функ­цию date() и из­ме­ни­те ка­лен­дарь так, что­бы вы­во­ди­мые со­об­ще­ния ме­ня­лись в за­ви­си­мо­сти от те­ку­ще­го ча­са. Пом­ни­те, что вам по­тре­бу­ют­ся за­пи­си не для ка­ж­до­го дня – толь­ко для ка­ж­до­го ча­са.
 
+
{{Врезка|right|Заголовок=Че­рез ме­сяц |Ширина=40%|Содержание=
245838.png
+
В сле­дую­щей ста­тье мы по­зна­ко­мим­ся с фор­ма­ми и прак­ти­че­­ски­­ми во­про­са­ми безо­пас­но­сти. Мы соз­да­дим про­стую фор­му и нау­чим­ся про­ве­рять ее на кор­рект­ность дан­ных, а так­же до­полним соз­дан­ный в этой ста­тье ка­лен­дарь F1 но­вой функ­цио­наль­но­стью. }}

Версия 16:08, 20 июня 2018


Содержание

PHP: Стро­им он­лайн-ка­лен­дарь

PHP Язык программирования, который пробил дорогу на множество сайтов

Часть 2: Раз­ви­вая свое началь­ное ру­ко­во­дство, Майк Мак­кей ис­сле­ду­ет мас­си­вы и функ­ции, что­бы на­пи­сать ка­лен­дарь ос­нов­ных со­бы­тий для на­ше­го сай­та.

На про­шлом уро­ке мы по­го­во­ри­ли об осно­вах PHP, и в том чис­ле о его соз­дании и по­сле­дую­щем раз­ви­тии. Мы так­же по­зна­ко­ми­лись с раз­лич­ны­ми по­ня­тия­ми язы­ка, та­ки­ми как пе­ре­мен­ные, стро­ки, це­лый чис­ла и внут­рен­няя функ­ция PHP date(). Се­го­дня мы по­зна­ко­мим­ся со всем этим бо­лее под­роб­но, а так­же уз­на­ем о мас­си­вах и функ­ци­ях, ко­то­рые по­мо­гут нам соз­дать пол­но­цен­ный ка­лен­дарь.

Мы пред­по­ла­га­ем, что на ва­шей плат­фор­ме Linux за­да­ны необ­хо­ди­мые на­строй­ки, и PHP-страницы об­ра­ба­ты­ва­ют­ся че­рез брау­зер, как мы и пред­ла­га­ли в пре­ды­ду­щем ру­ко­во­дстве. Ес­ли нет – по­жа­луй­ста, вернитесь к пре­ды­ду­щей ста­тье или об­ра­ти­тесь к врез­ке «Ус­та­нов­ка PHP в Linux».

Итак, что же та­кое мас­сив? Что­бы по­мочь дать ему оп­ре­де­ление, вернем­ся к пре­ды­ду­ще­му ру­ко­во­дству, когда мы хранили про­стое тек­сто­вое со­об­щение в пе­ре­мен­ной ($display_text). Про­бле­ма с пе­ре­мен­ны­ми со­сто­ит в том, что в ка­ж­дый мо­мент они мо­гут со­дер­жать толь­ко один эле­мент дан­ных. Не прав­да ли, бы­ло бы здо­ро­во, ес­ли бы мы мог­ли хранить несколь­ко эле­мен­тов дан­ных в од­ной пе­ре­мен­ной? Здесь-то и на­ста­ет че­ред мас­си­вов.

Вве­дение в мас­си­вы

Луч­ший спо­соб пред­ста­вить мас­сив – счи­тать его осо­бой пе­ре­мен­ной, ко­то­рая хранит дру­гие пе­ре­мен­ные. Мас­сив по­зво­ля­ет хранить внут­ри столь­ко эле­мен­тов, сколь­ко вам на­до (един­ст­вен­ное ог­раничение на раз­мер мас­си­ва на­кла­ды­ва­ет вы­де­лен­ный PHP объ­ем па­мя­ти). Мож­но прой­тись по всем эле­мен­там мас­си­ва (эта опе­ра­ция из­вест­на как тра­вер­си­ро­вание), и в PHP есть бо­лее 70 функ­ций, по­зво­ляю­щих вы­пол­нять с мас­си­ва­ми оп­ре­де­лен­ные дей­ст­вия, та­кие как по­иск внут­ри мас­си­ва, оп­ре­де­ление ко­ли­че­­ст­ва эле­мен­тов, уда­ление дуб­ли­ка­тов и да­же из­менение по­ряд­ка эле­мен­тов на об­рат­ный. Соз­дать мас­сив то­же про­ще па­ре­ной ре­пы:

$data = array();

(thumbnail)
Не­смот­ря на ог­ром­ное ко­ли­че­ст­во книг о PHP, наи­бо­лее точ­ным и все­объ­ем­лю­щим спра­воч­ным ру­ко­во­дством по язы­ку ос­та­ет­ся его сайт.

Мы соз­да­ли но­вый пустой мас­сив с именем $data. Мас­си­вы уст­рое­ны в со­от­вет­ст­вии с ар­хи­тек­ту­рой «ин­декс (ключ) – зна­чение». По умол­чанию при до­бав­лении эле­мен­та в пустой мас­сив его ин­декс в мас­си­ве ра­вен 0. Ес­ли до­ба­вить еще один эле­мент, его ин­декс в мас­си­ве бу­дет ра­вен 1.

Так­же мож­но соз­дать мас­сив с за­ранее определен­ны­ми дан­ны­ми (ес­ли вы уже знае­те, что в нем бу­дет). Для это­го соз­да­дим мас­сив так же, как пре­ж­де, но на этот раз ука­жем дан­ные в спи­ске че­рез за­пя­тую:

$data = array(‘Red’, Orange’, ‘Yellow’, ‘Green’, ‘Blue’);

Здесь в де­ло всту­па­ет сис­те­ма клю­чей. PHP ин­тер­пре­ти­ру­ет этот мас­сив сле­дую­щим об­ра­зом:

0 = ‘Red’, 1 = ‘Orange’, 2 = ‘Yellow’, 3 = ‘Green’ , 4 = ‘Blue’

Как ви­ди­те, ка­ж­до­му клю­чу со­от­вет­ст­ву­ет свое зна­чение. Важнее все­го помнить, что ин­декс в мас­си­ве всегда на­чи­на­ет­ся с 0, а не с 1, как мно­гие мог­ли бы пред­по­ло­жить; вна­ча­ле это лег­ко за­бы­ва­ет­ся.

Ас­со­циа­тив­ные мас­си­вы

Мас­си­вы так­же об­ла­да­ют доста­точ­ной гиб­ко­стью, что­бы по­зво­лить нам за­дать соб­ст­вен­ные клю­чи (та­кие мас­си­вы на­зы­ва­ют ас­со­циа­тив­ны­ми). Это очень удоб­но, когда нуж­но свя­зать зна­чение с оп­ре­де­лен­ным клю­чом, а не по­ла­гать­ся на ав­то­ма­ти­че­­ские ин­дек­сы.

Ска­жем, мы хо­тим со­хранить в мас­си­ве ин­фор­ма­цию о че­ло­ве­ке; для это­го мож­но сде­лать сле­дую­щее:

$person = array(‘name’ => ‘Mike Mackay’, ‘location’ => ‘Essex’, ‘age’ => 29);

С по­мо­щью ко­ман­ды ас­со­циа­ции (=>) мы сообщаем PHP, что хо­тим соз­дать ключ с именем name и свя­зать его со зна­чением Mike Mackay. В мас­си­ве мож­но хранить дан­ные лю­бых ти­пов – да­же дру­гие мас­си­вы. PHP ин­тер­пре­ти­ру­ет этот мас­сив имен­но так, как мы ожи­да­ем:

‘name’ = ‘Mike Mackay’, ‘location’ = ‘Essex’, ‘age’ = 29

Для об­ра­щения к эле­мен­ту мас­си­ва нуж­но лишь ука­зать мас­сив и необ­хо­ди­мый ключ:

echo $data[0];

Эта ко­ман­да вы­во­дит на эк­ран сло­во Red. Что­бы вы­вес­ти сло­во Orange, про­сто из­мените ин­декс с 0 на 1. В на­шем мас­си­ве person все столь же про­сто – что­бы вы­вес­ти имя, доста­точ­но сде­лать сле­дую­щее:

echo $person[‘name’];

До­ба­вим дан­ные в мас­сив

Ес­ли у нас есть мас­сив, но мы хо­тим до­ба­вить ту­да еще дан­ных, то как это сде­лать? На это есть несколь­ко спо­со­бов, которые час­то за­ви­сят от то­го, ис­поль­зу­ют­ся ли в мас­си­ве поль­зо­ва­тель­ские клю­чи или ин­дек­сы; но что­бы до­ба­вить но­вый эле­мент в наш мас­сив $data, мож­но про­сто сде­лать сле­дую­щее:

$data[] = ‘Indigo’;

По квад­рат­ным скоб­кам по­сле имени мас­си­ва PHP понима­ет, что мы хо­тим до­ба­вить зна­чение в мас­сив. В PHP есть встро­ен­ная функ­ция, ко­то­рая де­ла­ет то же са­мое:

array_push($data, ‘Indigo’);

Эта функ­ция принима­ет как минимум два ар­гу­мен­та. Пер­вый – мас­сив, в ко­то­рый нуж­но до­ба­вить дан­ные; осталь­ные – все эле­мен­ты, ко­то­рые за­тем бу­дут до­бав­ле­ны в конец мас­си­ва. Таким способом лег­ко до­ба­вить несколь­ко эле­мен­тов в мас­сив од­но­вре­мен­но, на­при­мер:

array_push($data, ‘Indigo’, ‘Violet’);

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

$person[‘profession’] = ‘Developer’;

Мас­си­вы внут­ри мас­си­вов

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

Для при­ме­ра возь­мем мас­сив во­ди­те­лей McLaren на Фор­му­ле-1. От­крой­те тек­сто­вый ре­дак­тор, вве­ди­те сле­дую­щий код и со­храните его под именем drivers.php в корневом ка­та­ло­ге web-серве­ра:

<?php

$drivers[] = array(

‘name’ => ‘Jenson Button’,

‘nationality’ => ‘British’,

‘championships’ => 1,

);

$drivers[] = array(

‘name’ => ‘Lewis Hamilton’,

‘nationality’ => ‘British’,

‘championships’ => 1,

);

?>

С по­мо­щью квад­рат­ных ско­бок мы со­об­ща­ем PHP, что хо­тим по­мес­тить дан­ные о во­ди­те­ле в конец мас­си­ва. Ка­ж­дый эле­мент внут­ри глав­но­го array() дол­жен от­де­лять­ся от дру­го­го за­пя­той. Те­перь мас­сив $drivers со­дер­жит два эле­мен­та: эти эле­мен­ты – мас­си­вы, ко­то­рые хра­нят ин­фор­ма­цию о во­ди­те­лях, ко­то­рую мы хо­тим ото­бра­зить. В понимании PHP дан­ные Джен­со­на Бат­то­на [Jenson Button] на­хо­дят­ся в $drivers[0], а дан­ные Льюи­са Хэ­мил­то­на [Lewis Hamilton] – в $drivers[1]. Мы мог­ли бы соз­дать поль­зо­ва­тель­ские клю­чи вме­сто ин­дек­сов 0 и 1, но для дан­но­го при­ме­ра это не обя­за­тель­но.

Мож­но бы­ло бы про­сто вы­вес­ти дан­ные ко­ман­дой echo, ука­зав ин­декс эле­мен­та (на­при­мер, $drivers[0]), но как ото­бра­зить все эле­мен­ты, когда мы не зна­ем дли­ны мас­си­ва? К сча­стью, есть про­стая управ­ляю­щая функ­ция foreach(), ко­то­рая по­зво­ля­ет это сде­лать.

Вы, воз­мож­но, спра­ши­вае­те, а по­че­му мы не зна­ем дли­ны мас­си­ва? Ну, мы зна­ем, ка­кие дан­ные о во­ди­те­ле хра­нят­ся в ка­ж­дом эле­мен­те (имя, на­цио­наль­ность и ко­ли­че­­ст­во чем­пи­он­ских ти­ту­лов), но за­прос к ба­зе дан­ных (или по­хо­жая функ­ция) мо­жет вер­нуть од­но­го во­ди­те­ля, а мо­жет – пять. Об­щее ко­ли­че­­ст­во эле­мен­тов в мас­си­ве мож­но бы­ло бы оп­ре­де­лить с по­мо­щью функ­ции PHP, но foreach() про­ще, и с ней код по­лу­ча­ет­ся ко­ро­че. Функ­ция foreach() да­ет нам удоб­ный спо­соб про­хо­дить по эле­мен­там мас­си­ва. Ско­пи­руй­те при­ве­ден­ный ниже код в толь­ко что соз­дан­ный файл drivers.php сра­зу по­сле объ­яв­ления мас­си­ва:

<?php

foreach($drivers as $driver) {

echo ‘Name: ‘ . $driver[‘name’]. ‘
’;

echo ‘Nationality: ‘ . $driver[‘nationality’]. ‘
’;

echo ‘World Championships: ‘ . $driver[‘championships’].



’;

}

?>

От­крыв файл в брау­зе­ре, вы долж­ны уви­деть об­щий спи­сок во­ди­те­лей на эк­ра­не:

  • Name: Jenson Button
  • Nationality: British
  • World Championships: 1 LXF154.codephp.syntax.opt
(thumbnail)
Бла­го­да­ря ре­дак­то­ру ко­да со встро­ен­ной про­вер­кой син­так­си­са (ти­па Eclipse, по­бе­ди­те­ля Срав­не­ния IDE в LXF152/153), вы сэ­ко­но­ми­те вре­мя и из­бе­жи­те огор­че­ний!
(thumbnail)
Ка­лен­дарь «Фор­му­лы-1» 2012, ко­то­рый мы вос­соз­да­дим с на­шим ко­дом.
  • Name: Lewis Hamilton
  • Nationality: British
  • World Championships: 1

В ка­ж­дом цик­ле $drivers зна­чение те­ку­ще­го эле­мен­та мас­си­ва за­пи­сы­ва­ет­ся в $driver (в пер­вом цик­ле это Джен­сон Бат­тон), а внут­ренний ука­за­тель мас­си­ва пе­ре­ме­ща­ет­ся впе­ред на один эле­мент; по­это­му в сле­дую­щем цик­ле из мас­си­ва бу­дет по­лу­чен сле­дую­щий эле­мент (Льюис Хэ­мил­тон). Так про­дол­жа­ет­ся до тех пор, по­ка не бу­дет най­ден конец мас­си­ва.

Функ­ции foreach() нуж­ны два па­ра­мет­ра. Пер­вый – мас­сив, по ко­то­ро­му мы про­бе­га­ем. За­тем ис­поль­зу­ет­ся клю­че­вое сло­во PHP as, за­тем – имя вре­мен­ной пе­ре­мен­ной, ко­то­рой мы хо­тим при­сво­ить те­ку­щий эле­мент мас­си­ва (эта пе­ре­мен­ная доступ­на толь­ко внут­ри цик­ла). Бу­к­валь­но мы го­во­рим: прой­тись по всем эле­мен­там мас­си­ва $drivers и со­хранить ин­фор­ма­цию о ка­ж­дом во­ди­те­ле во вре­мен­ный мас­сив $driver.

На­де­юсь, в этом при­ме­ре вам по­ка­жут­ся зна­ко­мы­ми неко­то­рые фраг­мен­ты из пре­ды­ду­ще­го ру­ко­во­дства; мы вы­во­дим стро­ку, скле­ен­ную из раз­лич­ных пе­ре­мен­ных – ка­ж­до­го по­ля с ин­фор­ма­ци­ей о во­ди­те­ле из мас­си­ва. За­тем мы склеи­ва­ем дру­гую стро­ку – это HTML-код, по­зво­ляю­щий нам вы­полнить об­щее фор­ма­ти­ро­вание вы­во­да. С по­следним эле­мен­том мас­си­ва $driver[‘championships’] мы вы­во­дим два пе­ре­но­са строк; это по­зво­ля­ет от­де­лить од­но­го во­ди­те­ля от дру­го­го.

По­го­во­рим о функ­ци­ях

В PHP есть два ти­па функ­ций:

1. Встро­ен­ные функ­ции PHP, та­кие как date() и array_push(). 2. Поль­зо­ва­тель­ские функ­ции. Зай­мем­ся вто­рым ти­пом функ­ций (о несколь­ких встро­ен­ных функ­ци­ях PHP мы уже рас­ска­за­ли).

Поль­зо­ва­тель­ская функ­ция – на­пи­сан­ный на­ми осо­бый блок PHP-ко­да, ко­то­рый мо­жет вы­пол­нять оп­ре­де­лен­ные дей­ст­вия в лю­бой мо­мент, когда он вы­зы­ва­ет­ся. Одни функ­ции об­ра­ба­ты­ва­ют дан­ные и за­тем от­сы­ла­ют об­рат­но но­вое зна­чение; дру­гие вы­пол­ня­ют од­но­на­прав­лен­ные опе­ра­ции, та­кие как запись дан­ных в файл или встав­ку дан­ных в ба­зу дан­ных. Что­бы соз­дать функ­цию, нуж­но на­пи­сать сло­во function, а за ним – имя функ­ции (важ­но от­ме­тить, что име­на функ­ций мо­гут на­чи­нать­ся толь­ко с букв или с сим­во­лов под­чер­ки­вания), за­тем круг­лые скоб­ки и па­ру фи­гур­ных ско­бок:

function shout() {

}

Мы так­же мо­жем пе­ре­дать в функ­цию дан­ные, ко­то­рые бу­дут ис­поль­зо­вать­ся внут­ри нее. Эти дан­ные на­зы­ва­ют­ся ар­гу­мен­та­ми функ­ции. При вы­зо­ве функ­ции и пе­ре­да­че ей ин­фор­ма­ции функ­ция при­сы­ва­ет эти дан­ные внут­ренней пе­ре­мен­ной $text, с ко­то­рой она мо­жет ра­бо­тать в дальней­шем. Эти дан­ные хра­нятся локаль­но внут­ри функ­ции и не пе­ре­за­пи­сы­ва­ют ника­ких пе­ре­мен­ных вне функ­ции:

function shout($text) {

}

Что­бы вер­нуть из­ме­нен­ные дан­ные об­рат­но, мож­но вос­поль­зо­вать­ся опе­ра­то­ром return:

function shout($text) {

return $text;

}

Для вы­зо­ва функ­ции ука­жи­те имя функ­ции, за ко­то­рым сле­ду­ют двой­ные скоб­ки с па­ра­мет­ра­ми или без (в за­ви­си­мо­сти от тре­бо­ваний функ­ции):

shout();

Мы соз­да­ли ба­зо­вую функ­цию, но она все­го лишь воз­ра­щает то, что мы ей пе­ре­да­ли – до­воль­но бес­смыс­лен­но, кто б спо­рил. Пусть она де­ла­ет нечто по­ин­те­реснее. Соз­дай­те но­вый файл PHP, ско­пи­руй­те в него сле­дую­щий код и со­храните его под именем function.php:

<?php

echo shout(‘Hello World’);

function shout($text) {

return strtoupper($text);

}

?>

За­пустив этот скрипт в брау­зе­ре, вы долж­ны уви­деть надпись «HELLO WORLD». Мы пе­ре­да­ем стро­ку на­пря­мую функ­ции, в ко­то­рой вы­во­дим на эк­ран воз­вра­щен­ное зна­чение.

У встро­ен­ной функ­ции PHP strtoupper() есть про­стое на­зна­чение – она бе­рет вход­ную стро­ку и пе­ре­во­дит ее в верхний ре­гистр. Мож­но бы­ло бы из­менить функ­цию, ис­поль­зо­вав вы­вод ко­ман­дой echo вме­сто опе­ра­то­ра return, но наш ме­тод да­ет боль­шую гиб­кость для раз­лич­ных це­лей (воз­мож­но, мы не всегда за­хо­тим вы­во­дить зна­чение немед­лен­но).

Внут­ри функ­ции мож­но пи­сать лю­бой код и вы­пол­нять лю­бые пре­об­ра­зо­вания строк.


If() и else()

Вы за­ме­ти­те в на­шем ко­де кое-что еще... мы бу­дем вы­пол­нять про­вер­ку усло­вия опе­ра­то­ра­ми if() и else(). If/else да­ет про­стой спо­соб вы­брать код, ко­то­рый нуж­но вы­полнить, осно­вы­ва­ясь на ре­зуль­та­те оп­ре­де­лен­ной про­вер­ки или усло­вия. If() вы­пол­ня­ет­ся толь­ко в том слу­чае, ес­ли зна­чение в круг­лых скоб­ках рав­но (или воз­вра­ща­ет) TRUE, в про­тив­ном слу­чае вы­зы­ва­ет­ся блок else() – в ка­ж­дом слу­чае вы­пол­ня­ет­ся код в фи­гур­ных скоб­ках, но толь­ко в од­ном из бло­ков:

if(condition is true) {

// Выполнить код этого блока

}

else {

// Выполнить код этого блока, а не того

}

В словесном выражении, нам нужно сле­дую­щее: ес­ли се­го­дняш­няя да­та есть в ка­че­­ст­ве клю­ча в мас­си­ве, то вы­во­дим дан­ные о за­ез­де, ина­че – вы­во­дим со­об­щение no races (за­ез­дов нет).

Те­перь, ис­поль­зуя на­ши мас­си­вы и знания о функ­ци­ях, соз­да­дим ка­лен­дарь основ­ных со­бы­тий.

Объ­е­ди­ня­ем все вме­сте

Мы не бу­дем пе­ре­бар­щи­вать и по­ка соз­да­дим ка­лен­дарь за­ез­дов F1 на 2012 го­д. Пе­ре­да­дим се­го­дняш­нюю да­ту функ­ции и вернем те­ку­щий за­езд, ес­ли се­го­дня они есть, в про­тив­ном слу­чае вы­ве­дем об­щее со­об­щение.

Начнем с соз­дания но­во­го PHP-фай­ла calendar.php, за­тем соз­да­дим функ­цию, ко­то­рая хранит мас­сив дат за­ез­дов:

<?php

function is_race_day() {

$race_dates = array(

‘18/3/2012’ => array(‘title’ => ‘Australian Grand Prix’, ‘location’ => ‘Melbourne’),

‘25/3/2012’ => array(‘title’ => ‘Malaysia Grand Prix’,‘location’ => ‘Kuala Lumpur’),

‘15/4/2012’ => array(‘title’ => ‘Chinese Grand Prix’, ‘location’ => ‘Shanghai’),

‘22/4/2012’ => array(‘title’ => ‘Bahrain Grand Prix’, ‘location’ => ‘Sakhir’),

‘13/5/2012’ => array(‘title’ => ‘Spanish Grand Prix’, ‘location’ => ‘Catalunya’),

);

}

?>

По­ка я вклю­чил в него толь­ко пять пер­вых дат се­зо­на, но вы мо­же­те до­ба­вить и боль­ше. Те­перь да­вай­те об­но­вим функ­цию. По­лу­чи­те се­го­дняш­нюю да­ту (см. опи­сание функ­ции date() в пер­вой ста­тье) и про­верь­те, про­хо­дит ли се­го­дня Гран-при; для это­го мы восполь­зу­ем­ся встро­ен­ной функ­ци­ей array_key_exists().

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

$date = date(‘m/d/Y’);

if(array_key_exists($date, $race_dates)) {

echo “Today’s race is the “ . $race_dates[$date][‘title’] . “ in “

. $race_dates[$date][‘location’] . “.”;

}

else {

echo “There is no race today.”;

}

Мы ис­поль­зу­ем зна­чение $date внут­ри функ­ции array_key_exists() – эта функ­ция принима­ет два па­ра­мет­ра: ключ, ко­то­рый вы ище­те (в дан­ном слу­чае это да­та), и мас­сив, в ко­то­ром про­из­во­дит­ся по­иск (наш мас­сив $race_dates).

Функ­ция array_key_exists() воз­вра­ща­ет бу­лев­ское зна­чение TRUE, ес­ли ключ су­ще­ст­ву­ет, и FALSE – ес­ли нет. Ес­ли за­езд най­ден, мы вы­во­дим ин­фор­ма­цию о нем. Мы мо­жем по­лу­чить эти дан­ные, так как зна­ем, что ключ су­ще­ст­ву­ет, по­это­му ис­поль­зу­ем пе­ре­мен­ную $date как яр­лык для по­лу­чения ин­фор­ма­ции. По су­ти, это то же са­мое, что на­пи­сать

echo $race_dates[‘13/5/2012’]

‘title’];

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

is_race_day();

За­тем мож­но за­пустить скрипт в брау­зе­ре, вве­дя calendar.php, или восполь­зо­вать­ся include() для его встраи­вания в су­ще­ст­вую­щий сайт. Ес­ли в день вы­зо­ва скрип­та су­ще­ст­ву­ет за­езд, мы по­лу­чим ин­фор­ма­цию о нем. Для про­вер­ки про­сто же­ст­ко за­дай­те да­ту в пе­ре­мен­ной $date:

$date = ‘13/5/2012’;

И с тем, за­кон­чим!

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

По­про­буй­те из­ме­нить ка­лен­дарь; мож­но быть бо­лее кон­крет­ным с да­та­ми и соз­дать со­бы­тия, ко­то­рые про­ис­хо­дят, на­при­мер, еже­днев­но. В ка­че­ст­ве уп­раж­не­ния взгля­ни­те на функ­цию date() и из­ме­ни­те ка­лен­дарь так, что­бы вы­во­ди­мые со­об­ще­ния ме­ня­лись в за­ви­си­мо­сти от те­ку­ще­го ча­са. Пом­ни­те, что вам по­тре­бу­ют­ся за­пи­си не для ка­ж­до­го дня – толь­ко для ка­ж­до­го ча­са.

Персональные инструменты
купить
подписаться
Яндекс.Метрика