Отправляет email-рассылки с помощью сервиса Sendsay

Программирование в Web

  Все выпуски  

Программирование в Web Выпуск 16 от 08/09/2006 Основы PHP - Урок-10


 
Программирование в web

ОСНОВЫ PHP
 

 
Внимание!!!
Все материалы уроков, публикуемых в этом и во всех последующих выпусках рассылки «Программирование в web», являются интеллектуальной собственностью авторов и ведущих рассылки. По всем вопросам размещения или публикации данных материалов на собственных ресурсах или где-либо еще, или иного использования, не связанного с личным ознакомлением и самостоятельным обучением, - обращайтесь на адрес автора. Любое использование этих материалов в коммерческих или иных целях, явно не разрешенное автором, является незаконным.
 

 
У Р О К    10
Здравствуйте уважаемые подписчики!

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


ФОРМЫ и ОПЯТЬ МАССИВЫ:

Настало время заняться более прикладными задачами. А именно обработкой форм. Какой же интерактивный сайт может обойтись без форм? Думаю, что никакой. Как еще посетитель сможет общаться со скриптом, кроме как формируя свой запрос из командной строки браузера (что очень неудобно) или же посредством передачи своих запросов через форму? Что такое формы я думаю знаете все, кто хоть как-то знаком с html. Их описание на html может выглядеть, например, так:


<form method="post" action="gettings.php">
<input type="text" name="header">
<TEXTAREA NAME="message" ROWS="20" COLS="90">Ваше сообщение</TEXTAREA>
<input type="submit" name="doing" value="Сохранить">

Вот этим тегом мы сообщаем, что следующий код содержит код формы - <form method="post" action="gettings.php">. Здесь есть два параметра (может быть и больше): первый — method — указывает, что форма будет передавать данные по определенному методу (обычно используется два различных метода, в реализации которых мы разбираться не будем), это метод post и метод get, которые мы будем считать (для PHP), равноправными. Следующий параметр — action — он сообщает браузеру, что конкретно будет получать и обрабатывать данные из формы. Для простоты данного примера предположим, что сама форма и сценарий находятся в разных файлах (хотя можно и в одном, этот пример я тоже покажу), тогда браузер загрузив форму покажет ее, а когда необходимо будет получить какие-то данные из формы, например, если посетитель нажал кнопку «Сохранит ь» браузер получит из формы имя файла, в котором находится сценарий-обработчик формы и пошлет запрос на сервер этому сценарию и уже дальше будет работать сценарий. Далее в форме есть два поля и одна кнопка. Одно из полей - <input type="text" name="header"> текстовое поле (в параметре type может содержаться и другое значение, например, password, в этом случае текст, вводимый в это поле будет автоматически заменяться на звездочки, а есть и другие параметры, но о них позже). У этого текстового поля есть параметр name, если мы собираемся передавать какие-то данные из этого поля сценарию, то этот параметр является обязательным, иначе как еще сценарий поймет к какому полю мы обратились. Также, в этом теге может быть указан параметр value, вообще, он не является обязательным, просто значение этого параметра будет использовано в заполнении поля по умолчанию, если вам такое нужно в вашей форме, то используйте этот параметр (< b>value="Какое-то значение"). Следующей строкой формы идет текстовый контейнер, то есть это поле тоже текстовое, но многострочное, в отличии от объявляемого тегом <input> однострочного. Такой контейнер удобно применять, например, при передачи текстовых сообщений, например же, в гостевых книгах. Хотя, в общем-то, если желаете, можете использовать и однострочные поля ввода, но просто для объемного текста будет удобнее использовать именно контейнеры. Ну и следующий тег <input type="submit" name="doing" value="Сохранить">, как видите тоже является тегом input, но параметр type задает другое его представление, а именно кнопку submit. Теперь давайте попробуем получить данные из этой формы (это сделает за вас браузер) и передать их сценарию (а это уже сделает PHP по запросу из сценария). Файл gettings.php первый вариант:


<?php
if ($doing) {
print $header."<br>";
print $message;
}
?>

Файл gettings.php второй вариант:


<?php
if ($_GET['doing']) {
print $_GET['header']."<br>";
print $_GET['message'];
}
?>

Файл gettings.php третий вариант:


<?php
if ($_POST['doing']) {
print $_POST['header']."<br>";
print $_POST['message'];
}
?>

Файл gettings.php четвертый вариант:


<?php
if ($_REQUEST['doing']) {
print $_REQUEST['header']."<br>";
print $_REQUEST['message'];
}
?>

Все эти варианты равнозначны, но с точки зрения безопасности последний, четвертый, наиболее предпочтителен. Во-первых, второй вариант вообще может не сработать, если сервер сконфигурирован на точные методы запросов (по умолчанию не играет роли каким методом данные передаются из формы, будь то post или get, данные будут и там и там). Поэтому мы можем вообще ничего не получить (ведь в форме использовался метод post, а не get). То есть (если сервер сконфигурирован по точным методам получения данных) в предопределенной PHP переменной $_POST будут содержаться данные полученные методом post, а в предопределенной переменной $_GET - данные полученные по методу get (отличие этих методов в том, что применение метода get имеет более широкие пределы, и, в основном, хорошо применять его для получения данных не из форм, а из командной строки браузера, то есть от туда, где вы вводите адрес ресурса интернета, а метод post ограничен получением данных из форм, но опять же, повторюсь, все это в большой степени зависит от конфигурации серверов). Первый вариант - это обращение к переменным напрямую. Здесь мы видим, что имена переменных совпадают с параметрами name полей формы. Это не случайно, при получении данных из формы PHP автоматически создает глобальные переменные с именами взятыми из параметров name полей формы, поэтому давайте значения этим параметрам латинским шрифтом (желательно маленькими буквами и цифрами, то есть как обычным переменным, но без указания знака доллара). Теперь понятно откуда появились переменные $doing, $header, $message - это всего лишь имена: первая переменная - имя кнопки, вторая - имя первого поля, третья - имя текстового контейнера. Все просто, как видите, теперь с этими переменными можно делать все, что угодно. В вышеуказанном примере значение этих переменных будет выведе но в браузер, если будет нажата кнопка (тут как раз и срабатывает проверка на нажатие кнопки, если бы я этого не сделал, то данные просто автоматически бы выводились в браузер вне зависимости, нажата ли была кнопка или нет, а это, согласитесь, не совсем то, что нам нужно). В данной конструкции if проверяется существование и значение переменной $doing (если переменная существует и ее значение true, то условие верно и выполняются выражения по этому условию). Хотелось бы заметить, что первый вариант будет работать только, если в настройках PHP включен параметр register globals, то есть разрешено использование глобальных переменных, часто их использование как раз запрещено, так что этот вариан малоприемлем, я его показал, лишь для того, чтобы вы поняли, как просто передать данные из формы сценарию. Ну и теперь скажу о четвертом варианте - $_REQUEST. Этот вариант наиболее предпочтителен, так как отвязывает нас от конкретного метода (post или get), а также гарантировано будет содержать наши данные из формы. Переменная $_REQUEST это многомерный массив, который всегда в себе содержит другие массивы глобальных переменных, в том числе все ключи и значения переменных $_POST и $_GET, а также еще одного массива $_COOKIE, который мы рассмотрим позже, когда будем разбирать работу с кукисами. Это значит, что переменная $_REQUEST является объединением переменных $_POST, $_GET и $_COOKIE и данные из этих переменных мы всегда можем получить или проверить через переменную $_REQUEST, так что рекомендую использовать именно ее. теперь еще немного об этих переменных, они являются массивами, а точнее, ассоциативными массивами, в которых в качестве ключей используются значения параметров name, а в качестве значений - данные из соответствующих полей формы (все это применительно к формам, фактически в своем сценарии вы можете обратиться к любой глобальной переме нной через массив $_REQUEST, но лучше эту переменную использовать только для получения данных из формы или для передачи данных в форму, но не для всех подряд глобальных переменных), этим и объясняется наше обращение к этим переменным таким образом - $_REQUEST['name']. Обратите внимание, что имена ключей массива внутри квадратных скобок я обрамил апострофами. Это применяется только по отношению к ассоциативным массивам (к массивам спискам нужно обращаться по другому - array[0], то есть без апострофов). Но хочу заметить, что если такое обращение к элементу массива производится внутри двойных кавычек, то апострофы ставить просто нельзя. То есть в открытом виде надо будет писать вот так - $_REQUEST['name'], а внутри двойных кавычек надо будет писать вот так - «$_REQUEST[name]». Если забудете об этом, интерпретатор будет сильно ругаться.


Теперь варианты расположения формы и сценария в одном файле:


Вариант первый - сценарий в одном файле с html-кодом формы и сразу после него:


<form method="post" action="gettings.php">
<input type="text" name="header">
<TEXTAREA NAME="message" ROWS="20" COLS="90">Ваше сообщение</TEXTAREA>
<input type="submit" name="doing" value="Сохранить">

<?php
if ($_REQUEST['doing']) {
print $_REQUEST['header']."<br />";
print $_REQUEST['message'];
}
?>

Вариант второй - сценарий в одном файле с html-кодом, но расположен до него:


<?php
if ($_REQUEST['doing']) {
print $_REQUEST['header']."<br />";
print $_REQUEST['message'];
}
?>

<form method="post" action="gettings.php">
<input type="text" name="header">
<TEXTAREA NAME="message" ROWS="20" COLS="90">Ваше сообщение</TEXTAREA>
<input type="submit" name="doing" value="Сохранить">

Вариант третий - форма генерируется самим сценарием:


<?php
if ($_REQUEST['doing']) {
print $_REQUEST['header']."<br />";
print $_REQUEST['message'];
}

print '<form method="post" action="gettings.php">';
print '<input type="text" name="header">';
print '<TEXTAREA NAME="message" ROWS="20" COLS="90">Ваше сообщение</TEXTAREA>';
print '<input type="submit" name="doing" value="Сохранить">';
?>

Естественно при этом, что файл во всех трех вариантах должен иметь расширение сценария php, то есть либо *.php либо *.phtml (или другие зарегистрированные для таких сценариев в системе, подробнее всегда можно узнать у вашего хостера). Какой из этих вариантов предпочесть - дело ваше. С точки зрения разделения кода сценария и кода шаблона - вариант размещения в разных файлах наиболее предпочтителен, но если внутри сценария используется только форма, без каких-то лишних оформлений, которые вы хотели бы поручить другому человеку - дизайнеру, то можно помещать и в одном файле, так вы избежите размножения файлов. В общем выбирайте сами нужный вам вариант. Кроме этих трех вариантов есть еще и четвертый, - html-код формы и сценарий располагаются в разных файлах, но на мой взгляд, такой способ не очень удобен, так как увеличивает количество файлов вашего проекта, а с другой стороны такой способ максимальн о отделяет компоненты вашей программы от оформления, которое может вести дизайнер, ничего не знающий о PHP.


Чуть выше я рассказал как получать данные из простых форм. А сейчас расскажу, как получать данные из форм-списков.


Вот, например, такой список:


<select name"sel" multiple>
<option>First
<option>Second
<option>Third
</select>

Это форма с множественным выбором, то есть из этого списка мы сможем выбрать сразу несколько элементов. Но если мы сейчас выберем любые два из этих элементов или все три сразу, а затем попробуем получить данные из формы, то $_REQUEST['sel'] вернет нам лишь один элемент и скорее всего им окажется последний из выбранных, например, Third. Это естественно не то, что нам надо, но как же сделать так, чтобы получить все выбранные данные, причем в удобном виде? А элементарно. Для этого мы просто используем возможность PHP создавать автомассивы. Вот так:


<select name"sel[]" multiple>
<option>First
<option>Second
<option>Third
</select>

Изменения коснулись только имени, теперь имя не sel, а sel[]. При получении данных из такой формы с таким именем PHP автоматически создаст автомассив с именем sel и поместит все полученные данные в этот массив под индексными ключами (от нуля и далее). То есть, если мы захотим выбрать все три значения, то в массиве в результате окажется следующее sel[0]==First, sel[1]==Second, sel[2]==Third (то есть будет массив array(First, Second, Third)). Обратиться к каждому из элементов соответственно можно будет так:


print $_REQUEST['sel'][0]; // Выведет First

print $_REQUEST['sel'][1]; // Выведет Second

print $_REQUEST['sel'][2]; // Выведет Third

Теперь чекбоксы:


<input type="checkbox" name="arr[]" value="ch1">
<input type="checkbox" name="arr[]" value="ch2">
<input type="checkbox" name="arr[]" value="ch3">
<input type="text" name="arr[]" value="Строка по умолчанию">
<textarea name="arr[]">Какой-то текст по умолчанию</textarea>

PHP опять же автоматически создаст автомассив с именем arr[] и доступ к каждому элементу этого массива можно будет получить, например так - print $arr[0]; - выведет значение первого элемента, или так - print $_REQUEST['arr'][1]; - выведет значение второго элемента массива arr[] (надеюсь не забыли, что нумерация индексов массива начинается с нуля). Как вы понимаете, вместо имени arr[] можно написать arr[first], arr[second], arr[third] и тогда на выходе получим не массив-список, а ассоциативный массив, где ключи будут неиндексными, ну и доступ через реквест будет таким тогда: - $_REQUEST['arr']['first'] ($_REQUEST["arr"]["first"] вместо апострофов в обрамлении можно использовать двойные кавычки, это не имеет большой разницы). Идея понятна? Не забудьте, что и в тегах и внутри двойных кавычек в скриптах имена ключей не должны обрамляться апос трофами, апострофами (или двойными кавычками) они обрамляются только вне двойных кавычек и вне тегов html тоже. Смотрите внимательно примеры.


Радиокнопки:


Имя: <input type="text" name="data[name]" value="Имя">
Адрес: <input type="text" name="data[address]" value="Адрес">
Город:<br />
<input type="radio" name="data[city]" value="Volgograd">Волгоград
<input type="radio" name="data[city]" value="Peter">Санкт-Петербург
<input type="radio" name="data[city]" value="Nizny">Нижний Новгород

Тут понятно, что будет создан массив $data с соответствующими ключами и значениями (ключи name, address и city). Немного еще раз поясню. Имена ключей внутри квадратных скобок при обращении к элементам массива в сценарии в открытом виде обязательно должны обрамляться апострофами или двойными кавычками, внутри строк, обрамленных двойными кавычками и внутри тегов html имена ключей внутри квадратных скобок не должны обрамляться ничем, иначе это вызовет ошибку. В строках, обрамленных апострофами, переменные не интерполируются, но апострофы внутри таких строк (как впрочем и кавычки внутри строк, обрамленных такими же кавычками) должны предваряться обратным слешем, чтобы отключить их специальное действие. Ну это я уже говорил в предыдущих уроках.


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


<?php
// Здесь проверяем, нажата ли кнопка и подавляем вывод об ошибке
if (@$_REQUEST['doing']) {
foreach ($_REQUEST['data'] as $key=>$value) {
        if ($value) {print "Вы выбрали $key<br />";}
        else {print "Вы не выбрали $key<br />";}
        }
}
?>

<form action="checked.php" method="post"><br />";
Что бы вы выбрали?
<input type="hidden" name="data[work]" value="0">
<input type="checkbox" name="data[work]" value="1">Работа
<input type="hidden" name="data[rest]" value="0">
<input type="checkbox" name="data[rest]" value="1">Отдых
<input type="submit" name="doing" value="Отправить">

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



Теперь чуток поподробнее О МАССИВАХ:

В PHP встроено очень много готовых функций для обработки массивов. Также над массивами можно проводить и простые операции. Давайте немного об этом расскажу:


Допустим у нас есть два массива:


$names=array("name"=>"Andrey", "surname"=>"Bolshakov");

$addresses=array("city"=>"Moscow", "street"=>"Lipetskaya-40", "apartaments"=>"364");

Эти два массива мы можем склеить в один, например вот так:


$array=$names+$addresses;

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


array("name"=>"Andrey", "surname"=>"Bolshakov", "city"=>"Moscow", "street"=>"Lipetskaya-40", "apartaments"=>"364");

Заметьте, что если в одном из массивов до операции слияния посредством плюса (+) содержались ключи с именами, совпадающими с именами ключей из другого массива, то при этом значения совпадающих ключей из массива, который в операции стоит правее, заменят значения совпадающих ключей в массиве, которые в операции стоит левее. То есть, $a+$b - значения из $b заменят значения из $a. Поэтому данную операцию не стоит применять к массивам-спискам, ведь там индексные ключи и они будут совпадать естественно в обоих массивах, особенно, если число элементов у них одинаковое и тогда данные из одного массива просто перепишут данные в другом, а это не то, что мы ожидаем. А вот такую операцию $a+=$b можно применить к массивам-спискам, чтобы обновить данные в $a данными из $b, но если мы эту операцию применим к ассоциативным массивам, то данные в $a останутся неизменными. Это тоже не то, что мы ожидаем. Как же обновить данные в $a данными из $b? Для этого надо воспользоваться функцией array_merge(). Если теперь записать так - array_merge($a, $b), то данные из $b обновят данные в $a и поместят в результирующий массив (поэтому данную функцию можно применять справа от оператора присваивания (=)), а ключи, которых в $a не существуют, но существуют в $b просто добавятся, и наоборот, ключи, которых не существует в $b, но существуют в $a тоже добавятся в результирующий массив. Это касательно ассоциативных массивов, а если и $a и $b массивы-списки, то данные из $b не заменят данные в $a а просто к ним добавятся, естественно с соблюдением порядка индексов. То есть, если у нас два массива-списка каждый из двух элементов (с индексами соответственно 0 и 1), то при применении этой функции мы получим результирующий массив из четырех элементов, с индексами, сответственно, от 0 до 3. То есть в результирующем массиве-списке данные будут идти в таком порядке, сначала то, что было в первом по порядку массиве, записанному в качестве параметров функции array_merge(), а затем элементы из второго по порядку массива-списка с индексацией начинающейся уже со следующего номера после окончания предыдущего. Ну, думаю, хоть и немного путано объяснил, но понятно. Вобщем для слияния массивов применяйте именно array_merge(), а для обновления значений в массивах списках - оператор плюс (+).


Как можно перебрать все элементы массива? Есть два способа: косвенный и прямой в стиле PHP версии 4 и выше.


Косвенный перебор:


<?php
$a=array("First", "Second", "Third", "Forth");
for ($i=0; $i$a); $i++) {
print "Элемент номер $i содержит значение $a[$i]";
}
?>

Забегая немного вперед, скажу, функция count() и ее синоним sizeof() возвращают общее количество элементов в массиве, то есть в нашем примере будет возвращено число 4.


Прямой перебор:


<?php
$a=array("First", "Second", "Third", "Forth");
$b=array("first"=>"First", "second"=>"Second", "third"=>"Third");
foreach ($a as $val) {
print "Значение элемента - $val";
}
foreach ($b as $key=>$value) {
print "Элемент с ключом $key имеет значение $value";
}
?>

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


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


list ($first, $second, $third, $forth)=$b;

Здесь каждой переменной ($first, $second, $third, $forth) будет присвоено каждое значение в соответствии с порядком следования из массива $b. Если перечислено переменных в list() меньше, - ничего страшного, если больше - тоже ничего страшного, переменным, которым при раздаче не хватило значения, - будет присвоено пустое значение. Естественно при таком подходе можно пропускать переменные как справа, так и слева, главное при этом, не забывать ставить нужное количество запятых, например из нашего примера:


list(,,$third)=$b;

то есть мы присвоим переменной $third значение третьего элемента массива (элемента с индексом 2) $b.


Сортировка массивов:


Массивы можно сортировать, для этого в PHP существует множество различных встроенных функций.


Лексикографическая и числовая сортировка:


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


SORT_REGULAR - автоматический выбор метода
SORT_NUMERIC - числовая сортировка
SORT_STRING - лексикографическая сортировка.

В чем разница между лексикографической сортировкой и числовой? Ну представим себе такую ситуацию, например у нас имеется куча файлов, имена которых заканчиваются на числовой индекс, например, 1.gif, 2.gif, 10.gif и 20.gif. При числовом методе отсортированные данные будут выглядеть так:


1.gif
10.gif
2.gif
20.gif

Согласитесь, это не очень красиво? Но можно, при включении режима лексикографической сортировки получить выход таким:


1.gif
2.gif
10.gif
20.gif

Ну как, так приличнее?


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


asort($array, [$flag]) - принимает в качестве параметра массив, рассматривает его как ассоциативный массив и возвращает отсортированный по возрастанию массив с сохранением связи между пар ключ=>значение.

arsort($array, [$flag]) - принимает в качестве параметра массив, рассматривает его как ассоциативный массив и возвращает отсортированный по убыванию массив с сохранением связи между пар ключ=>значение.

ksort($array, [$flag]) по возрастанию и krsort($array, [$flag]) - по убыванию, сортируют массив не по значению ключей, а по самим ключам, а в остальном такие же как и asort() и arsort().

Пользовательская сортировка:


Вы можете создать и собственную функцию сортировки массива, и для ее применения применить функцию uksort($array, $callback). Параметр $callback - это ваша собственная функция, устанавливающая критерии сортировки. Например, удобно эту функцию применять для сортировки содержимого каталогов, например, чтобы все было отсортировано не только в лексикографическом порядке, но и имена каталогов предшествовали именам файлов. Эта функция сортирует по ключам, а вот эта - uasort($array, $callback), делает тоже самое, но по значениям.


Иногда вам может понадобится не сортировать массив, а просто перевернуть его, чтобы последний элемент стал первым и наоборот. Для этого удобно применять функцию array_reverse($array, [$preserve_key]). $preserve_key по умолчанию false, но если мы выставим значение true, тогда переворачиваться будут только значения, а ключи останутся в прежнем порядке, связи между парами ключи=>значение естественно теряются в этом случае. Если же false, то переворачивание происходит с сохранением связей.


natsort($array) - естественная сортировка. Ее можно рассматривать как сортировку в лексикографическом порядке, но применимо не только к цифровым значениям, а и к смешанным, например файлы image1.jpg, image2.jpg и image10.jpg отсортированные функцией asort(), будут расположены так:

image1.jpg
image10.jpg
image2.jpg,

а функцией natsort() так:

image1.jpg
image2.jpg
image10.jpg

Что намного приятнее.

Функция natcasesort($array) работает точно также, как и функция natsort() с той лишь разницей, что ей плевать на регистры символов.

Если нам не важны связи между парами ключ=>значение, то есть если мы сортируем массивы списки, то можно воспользоваться эквивалентами вышеперечисленных функций, работающими почти также, но без сохранения связей:


sort($array, [$flag]) - Сортировка по возрастанию
rsort($array, [$flag]) - Сортировка по убыванию
usort($array, $callback) - Пользовательская сортировка
shuffle($array) - Перемешивание массива случайным порядком

array_flip($array) - Перебирает массив и меняет местами ключи и значения, то есть после применения этой функции в результате будет выдан массив в котором значения стали ключами, а ключи - значениями.

array_keys($array, [$searchval]) - Возвращает список из всех ключей массива $array, а если задан необязательный параметр $searchval, то вернет только те ключи, значения которых соответствуют параметру $searchval.

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

in_array($val, $array) - Возвращает true, если в массиве $array существует элемент со значением $val.

array_count_values($list) - Подсчитывает, сколько раз каждое значение массива-списка $list встречается в нем самом.

array_merge($array1, $array2) - Слияние массивов, о нем я уже рассказывал.

array_slice($array, $num, [$len]) - Возвращает часть массива $array, начиная с элемента с номером $num и с количеством элементов $len, если $len не задан, то до конца массива.

array_splice($array, $num, [$len], [$repl]) - Аналогична array_slice(), но при этом еще может и заменять указанные элементы массива на элементы из $repl или если $repl не указан, то просто удаляет из массива только что найденные элементы.

Псевдостеки:


array_push($array, $val1, [valn,...]) - Добавляет к массиву элементы $val1, $valn..., присваивая их ключам числовые индексы. Конечно если вам надо добавить всего пару элементов, то, наверное проще будет воспользоваться созданием автомассива $array[]=$val1; $array[]=$valn..., но если вам надо таким образом добавить, например, сотню - другую элементов? Элементы всегда добавляются в конец массива

aray_pop($array) - Снимает элемент с вершины стека, то есть возвращает последний элемент массива, с удалением его из самого исходно массива, исходный массив при этом ИЗМЕНЯЕТСЯ.

array_unshift($array, $val1, [valn,...]) - Очень похожа на array_push(), но добавляет элементы не в конец массива, а в его начало, то есть вдвигая элементы слева, порядок следования, при этом, элементов из параметров функции не изменяется.

array_shift($array) - напоминает array_pop(), но снимает не с вершины стека, то есть не последний элемент массива, а с основания, то есть самый первый элемент массива, при этом удаляя из исходного массива этот элемент (исходный массив ИЗМЕНЯЕТСЯ)

Функция compact($a1, [$a2,...,$an]) - появилась только в версии 4 PHP - Упаковывает переменные из текущего контекста (глобального или из контекста функции) с именами $a1, [$a2,...,$an] в ассоциативный массив с ключами, равными именам переменных и значениями равными их значениям.

Обратная ей фукнция extract($array, $type, [$prefix]) - извлекает из массива пары ключ=>значение и создает переменные с именами ключей и соответствующими значениями, параметр type задает, что делать если переменная на момент извлечения уже существует:

EXTR_OVERWRITE - перезаписывать существующую переменную
EXTR_SKIP - не перезаписывать переменную если она уже существует
EXTR_PREFIX_SAME - в случае совпадения имен создавать предваренную префиксом из $prefix
EXTR_PREFIX_ALL - всегда предварять имена создаваемых переменных префиксом из $prefix

По умолчанию установлен первый режим. Параметр $prefix имеет смысл только при двух последних режимах. compact() и extract() применяют очень редко, почему-то считается дурным тоном применять эти две функции кроме как в шаблонах.

Функция implode($str, $list) и ее синоним join($str, $list) берут массив-список (можно и ассоциативный, но тогда все ключи будут восприниматься как индексы и не сохранятся) и возвращают строку, которая содержит все элементы массива, разделенные между собой строкой из параметра $str.

Функция explode($str, $string, [$limit]) получает строку $string, разбивает ее по строке $str на отдельные элементы и возвращает массив список, состоящий из этих элементов. Если задан параметр $limit, то при разбиении в результат берутся только $limit полей. То есть эта функция по сути обратная функциям implode() и join(). Применительно к практике мы еще рассмотрим эти функции в дальнейшем.

Если вас обрадовали предыдущие две функции, то посмотрите вот на эти две:


serialize($object) - Функция упаковывает массив любой размерности и любой структуры в строку и возвращает эту строку (лучше всего применять к ассоциативным массивам) примерно такого вида: - a:2:{s:4:"name";s:9:"Anatolick";s:5:"email";s:19:"manatolick@narod.ru";} Такую строку, впоследствии можно записать в файл или в базу MySQL, или еще что-то с ней сделать.

unserialize($string) - Функция обратная функции serialize(), на входе получает строку примерно такого вида: a:2:{s:4:"name";s:9:"Anatolick";s:5:"email";s:19:"manatolick@narod.ru";}, а на выходе выдает ассоциативный массив array("name"=>"Anatolick", "email"=>"manatolick@narod.ru"). Как видите сохранились не только значения элементов массива, но и имена ключей и сохранились еще между ними связи. Удобная штука, неправда ли?

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


В практическом применение эти функции будут рассматриваться в следующих уроках.


array_change_key_case($array, $case=CASE_LOWER) - Возвращает массив, у которого имена всех ключей переведены в другой регистр, в зависимости от значения параметра $case:
CASE_UPPER - верхний регистр
CASE_LOWER - нижний регистр

Создание диапазона чисел:


range($low, $high) - Создает массив список, с числами от $low до $high.

Работа с множествами:


array_intersect($array1, $array2, [$arrayn...]) - Пересечение множества, то есть возвращает массив элементы которого одновременно существуют во всех массивах, переданных ей в параметрах.

array_diff($array1, $array2, [$arrayn...]) - Разность множеств - возвращает массив из элементов $array1, которых нет ни в одном другом массиве из параметров

Объединение множеств можно создать с помощью функций array_unique($array) - данная функция возвращает массив, составленный из всех уникальных значений исходного массива вместе с их ключами, не нарушая связей, и, array_merge(). Если честно, то данные операции в PHP применяются редко, и, если вы пожелаете их использовать где-нибудь в своих проектах, обратитесь за подробностями к документации по PHP.


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


 

 
Объявления!!!

Если у вас возникли какие-то вопросы, не стесняйтесь, задавайте. Для этого, всего лишь, пошлите на мой адрес письмо с вопросом и с темой, в которой обязательно укажите какого урока и какого языка касается вопрос. Например, тема может быть такой - «Основы PHP. Урок 10. Вопрос». Также, с такой же темой и на этот же адрес вы можете прислать и свои дополнения к уроку. Если дополнения будут существенными, то в последующих уроках они обязательно будут учтены.

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

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

Маленькая просьба. Многие из вас присылают мне запросы на отправку им того или иного, не полученного ранее, выпуска рассылки. У меня не всегда есть возможность это сделать. Поэтому предлагаю вам для начала посмотреть нужный выпуск в архиве рассылки. Рассылка выходит сразу на трех рассыльных сервисах, и по некоторым причинам (мне не известным) некоторые сервисы не принимают адресов, в которых встречаются именя конкурирующих рассыльных сервисов, по этой причине я опубликую только одну ссылку на архив рассылки только одного рассыльного сервиса, а именно Content.mail.ru. Вот ссылка на на этот архив рассылки - http://content.mail.ru/pages/p_21931.html. В обще м-то это объявление наверное лишнее, ведь в каждом выпуске каждой рассылки, вне зависимости от того, на каком сервисе она выходит, всегда указан этот самый адрес архива рассылки. На сабскрайб.ру и на контент.мэйл.ру этот адрес указывается в самом низу выпуска, а на мэйллист.ру - в самом верху выпуска. Так что, при достаточном внимании, вы сами легко сможете найти нужную ссылку на архив рассылки.

 

 
Внимание!!!
Все материалы уроков, публикуемых в этом и во всех последующих выпусках рассылки «Программирование в web», являются интеллектуальной собственностью авторов и ведущих рассылки. По всем вопросам размещения или публикации данных материалов на собственных ресурсах или где-либо еще, или иного использования, не связанного с личным ознакомлением и самостоятельным обучением, - обращайтесь на адрес автора. Любое использование этих материалов в коммерческих или иных целях, явно не разрешенное автором, является незаконным.
 

 
Наш проект и наши друзья
Автор рассылки — Anatolick
Архив рассылки — http://content.mail.ru/pages/p_21931.html
Сайт проекта — «Russian discussions Zone»
Движок для сайтов — «Tanat-Engine»
Проект Web Help — «Web-Help.int.ru»
Дискуссионный лист — «Все для Всех о РС»
Дискуссионный лист — «File Info Masters»
Дискуссионный лист — «Напряги мозги»
Дискуссионный лист — «Ищем все…»
Дискуссионный лист — «Все обо Всем по Email»
Дискуссионный лист — «Внимание! Розыск…»
Дискуссионный лист — «Английский для Всех и каждого»
Группа стандартизации в Web — W3C.org
 

В избранное