PHP-4 Эффективная работа


Основные функции работы с массивами
Сортировка массивов
Дополнительные функции работы с массивами

8.2.7. Сортировка по алгоритму «natural»: natsort

void natsort (array array)

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

<HTML>
<ТIТLЕ>Сортировка по алгоритму natural</TITLE>
<body bgcolor="#FFFFFF"xfont size=+l>
<h2>Сопоставление двух алгоритмов сортировки</h2>
<table border=l>

<tr>
<th>Стандартная copтиpoвкa</th><th> </th>
<th>Сортировка no алгоритму natural</th></tr>
<tr>
<?
$arrayl = $array2 = array ("img12.png","imglO.png",
          "img2.png"."imgl.png");

sort($arrayl);
echo "<td><pre>\n";
print_r($arrayl);

natsort($array2);
echo "\n</pre>/td><td> </td><td><pre>\n";
print_r($array2);
?>
</pre></td>
</tr></table>

В результате сортировки мы получим массивы, приведенные на рис. 8.3. См. также описания функции natcasesor t( ) (раздел 8.2.8).


Рис. 8.3. Сортировка по алгоритму natural оправдывает «интуитивные» представления об упорядочивании числовых значений

8.2.8. Сортировка natural без учета регистра:natcasesort

void natcasesort (array array)

Функция, как и функция natsort, предназначена для реализации алгоритма сортировки, который упорядочивает алфавитно-цифровые строки «по-человечески». Эта функция представляет собой версию рассмотренной выше natsort() (раздел 8.2.14), нечувствительную к регистрам символов, входящих в состав строк.

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

void uasort (array array, function cmp_function)

Функция производит сортировку массива array с использованием для сравнения двух элементов функции, определенной пользователем, имя которой передается через аргумент cmp_function. Ориентирована на сортировку ассоциативных массивов, поскольку изменяет только порядок следования ключей. Примеры использования этой функции приведены при рассмотрении usort () (раздел 8.2.11) и uksort () (раздел 8.2.10).

8.2.10. Пользовательская сортировка по ключам: uksort

void uksort (array array, function cmp_function)

Функция осуществляет сортировку ключей массива array с использованием пользовательской функции сравнения элементов cmp_function. Вот пример ее использования:

function cmp ($а, $b) {
       if ($a == $b) return 0;
       return ($a > $b) ? -1 : 1;

$a = array (4 => "четыре", З => "три",
          20 => "двадцать", 10 => "десять");
uksort ($a. "cmp");
while (list ($key, $value) = each ($a)) {
       echo "$key: $value\n";

В результате получаем:
20: двадцать
10: десять
4: четыре
3: три

8.2.11. Пользовательская сортировка по значениям: usort

void usort (array array, string cmp_function)

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

function cmp ($a, $b) {
       if ($a == $b) return 0;
       return ($a > $b) ?-1:1;

$a = array (3, 2, 5, 6, 1) ;
usort ($a, "cmp");
while (list ($key, $value) = each ($a)) {
       echo "$key: $value\n";
В результате массив будет отсортирован следующим образом:
0: 6
1: 5
2: 3
3: 2
4: 1

8.2.12. Многомерная сортировка массивов: array multisort

bool array_multisort (array arl [, mixed arg [, mixed ...
[, array ...]]])

Функция array_multisort() может использоваться для одновременной сортировки нескольких массивов или сортировки многомерного массива по одному или нескольким измерениям. При этом во время сортировки сохраняются ассоциации ключей со значениями.

Входные массивы интерпретируются функцией как столбцы некоторой таблицы, сортируемой построчно, что в целом эквивалентно оператору SQL ORDER BY. Как правило, первым объектом сортировки является первый аргумент функции. Строки (то есть значения) этого массива сравниваются и сортируются со строками (значениями) второго массива и т. д.

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

1. Направление:
  • SORT_ASC (сортировка в порядке возрастания);
  • SORT_DESC (сортировка в порядке убывания).
2. Способ:
  • SORT_RЕGULAR (обычное сравнение элементов);
  • SORT_NUМЕRIС (числовое сравнение элементов);
  • S0RT_5TRI NG (сравнение строковых значений элементов).

Не допускается использование двух флагов из одинаковых групп после имени массива. Флаги сортировки, упомянутые после имени массива, применяются только к этому массиву и после ввода среди аргументов функции нового имени массива автоматически сбрасываются к значениям по умолчанию — SORT_ASC и SORT_REGULAR.

В случае успешного выполнения сортировки функция возвращает true, а при неудаче — false:

// Простой пример сортировки нескольких массивов
$arl = array ("10". 100, 100, "а");
$ar2 = array (1, 3, "2", 1);
array_multisort ($arl, $ar2);

В приведенном выше фрагменте после завершения сортировки первый массив будет содержать последовательно: 10, «а», 100, 100. Во втором массиве будут храниться значения 1, 1, 2, «3». Обратите внимание, что при этом во втором массиве произошла сортировка записей, которые соответствовали идентичным записям первого.

8.2.13. Перемешивание содержимого массива: shuffle

void shuffle (array array)

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

Пример использования функции:
$numbers = range (1,20);
srand ( (double) miсrotime () *1000000) ;
shuffle ($numbers) ;
while (list (, $number) = each ($numbers)) {
       echo "$number " ;

8.3. Дополнительные функции работы с массивами

Теперь мы рассмотрим набор вспомогательных функций, предназначенных для решения ряда специальных задач, так сказать, «верхнего» уровня. Все эти функции интенсивно используют рассмотренное выше семейство аrrау_*. Их имеет смысл использовать для решения типовых практических задач.

8.3.1. Генерация массива: compact

array compact (mixed varname [, mixed ...])

Функция compact () принимает переменное количество аргументов. Каждый из параметров может представлять собой либо строку, содержащую имя переменной, либо массив с именами переменных. Массив, в свою очередь, может содержать другие массивы с именами переменных — compact () обрабатывает все свои аргументы рекурсивно.

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

Любые строки, которые не могут быть интерпретированы как имена переменных (например, по причине отсутствия определения такой переменной), просто игнорируются:

$city = "Москва";
$state = "Россия";
$event = "Научно-техническая конференция ЦНИИРЭС";

$location_vars = array ("city", "state");

$result = compact ("event", "nothing_here", $location_vars);
После выполнения этой функции переменная $resuit будет содержать массив
( "event" => "Научно-техническая конференция ЦНИИРЭС",
     "ci ty" => "Москва",
     "state" => "Россия"
)

8.3.2. Подсчет количества элементов: count

int count (mixed var)

Функция возвращает количество элементов, содержащихся в переменной var, которая обычно3 представляет собой массив.

Если переменная не является массивом, функция возвращает 1, а если переменная вообще не определена, возвращает 0.

Вот пример использования этой функции:
$а[0] = 1;
$а[1] = 3;
$а[2] = 5;
$result = count ($a);
//$result == 3

совет
       Функция count() может вернуть 0, если переменная не инициализирована, а также в том случае, если переменная инициализирована как пустой массив, поэтому для проверки наличия значения переменной следует использовать функцию isset().

8.3.3. Текущий элемент массива: current

mixed current (array array)

Каждый массив, определенный в PHP-машине, содержит внутренний указатель на «текущий элемент», которым изначально является первый элемент, вставленный в массив при его создании.

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

8.3.4. Извлечение очередной пары «ключ-значение»: each

array each (array array)

Возвращает текущую пару «ключ-значение» из массива array и продвигает внутренний указатель массива на следующий элемент. Пара возвращается как результат работы функции в виде четырехэлементного массива с ключами: 0, 1, key и value. Элементы 0 и key содержат имя ключа элемента исходного массива, а элементы 1 и value содержат данные.

Если внутренний указатель массива указывает за пределы содержимого массива, функция each() возвращает false:
$foo = array("bob", "fred", "jussi",
          "jouni", "egon", "marliese");
$bar = each ($foo) ;

В результате переменная $bar будет представлять собой массив со следующими парами «ключ-значение»: 0=>0; l=>bob; key=>0; value=>bob.

Для закрепления материала приведу еще один пример:
$foo = array ("Robert" => "Bob", "Seppo" => "Sepi");
$bar = each ($foo);

Теперь переменная $bar содержит следующие пары: 0=>Robert; l=>Bob; key=>Robert; value=>Bob.

Как правило, функция each() используется совместно с list() для последовательного обхода всего массива. Например, вы можете использовать при отладке своих сценариев следующий фрагмент, который выводит на печать содержимое всех переменных, переданных методом POST в вашу программу:

echo "Методом POST получены переменные:<br>";
reset ($HTTP_POST_VARS);
while (list ($key, $val) = each ($HTTP_POST_VARS)) {
       echo "$key => $va<br>";
}

После завершения выполнения функции each() внутренний указатель массива перемещается на следующий элемент массива или на последний элемент, если достигнут конец массива.

8.3.5. Перемещение в конец массива: end

mixed end (array array)

Функция end () продвигает внутренний указатель массива на последний элемент и возвращает этот элемент в качестве значения.

8.3.6. Извлечение из массива: extract

int extract (array var_array [, int extract_type
                                                            [, string prefix]])

Функция используется для импортирования переменных из массива в текущую таблицу символов. Ее аргументом является ассоциативный массив var_array, ключи которого интерпретируются как имена переменных, а значения ассоциированных с этими ключами элементов — как значения переменных. Для каждой пары «ключ—значение» функция создает переменную в текущей таблице символов с учетом значений необязательных аргументов ехt rасt_tуре и рrеfix.

По завершении работы функция возвращает количество извлеченных из массива элементов.

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

EXTR_OVERWRITE В случае возникновения конфликта значение существующей переменной перекрывается новым
EXTR_SKIPВ случае возникновения конфликта значение переменной остается прежним
EXTR_PREFIX_SAME В случае возникновения конфликта к имени импортируемой переменной добавляется префикс
EXTR_PREFIX_ALL Все имена переменных, импортируемых в таблицу символов, снабжаются префиксом
EXTR_PREFIX_INVALID Префикс добавляется только к неверным или числовым именам переменных (если ключ представляет собой число)

В случае если аргумент extract_type не задан по умолчанию, используется режим EXTR_OVERWRITE.

Как можно судить из приведенного выше списка режимов, аргумент prefix необходимо указывать только для режимов импорта — EXTR_PRE F IX_SAME, EXTR_PREF IX_ALL или EXTR_PREFIX_INVALID. В случае если даже с добавлением префикса РНР-машине не удастся сформировать правильное имя переменной, оно не будет добавляться в таблицу символов.

совет
       Одно из возможных полезных применений extract() состоит в совместном использова- нии с функцией кроссплатформенного обмена на базе протокола WDDX wddx_deserialize() (см. раздел 19.2.6).

8.3.7. Проверка наличия элемента: in array

boot in_array (mixed needle, array haystack [, bool strict] )

По образному выражению разработчиков РНР, эта функция «ищет иголку needle в стоге сена haystack» и возвращает true, если ее удается отыскать, или false, если «иголки» в стоге не нашлось

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

Вот простой пример работы функции поиска:
$os = array ("Mac", "NT", "Irix", "Linux");
if (in_array ("Irix", $os)){
       print "Silicon Graphics - это круто!";
       }

8.3.8. Поиск значения в массиве: array_search

mixed array_search (mixed needle, array haystack, bool strict)

Похожа на рассматриваемую выше функцию in_array() в том отношении, что «ищет иголку needle в стоге сена haystack», но при этом возвращает ключ соответствующего элемента массива, если поиск завершается успешно, и false, если такого значения в массиве нет.

В том случае, если при вызове функции был указан аргумент strict, функция также проверяет тип искомого элемента массива.См. также описание in_array() (раздел 8.3.7).

8.3.9. Загрузка текущего ключа ассоциативного массива: key

mixed key (array array)

Функция key () возвращает ключ элемента ассоциативного массива, на который указывает внутренний указатель массива.

8.3.10. Создание списка: list

void list (...)

Работает в целом аналогично аrrау(), но является не функцией как таковой, а конструкцией языка. Используется для одновременного помещения в список сразу нескольких переменных:

<table>
     <tr>
        <th>Ф.И.O. сотрудника</th>
        <th>3apплатa</th>
     </tr>

<?php
$result = pg_Exec($conn, "SELECT id, name, salary FROM employees");
$i=0;
while (list ($id, $name, $salary) = pg_fetch_row($result$ ,$i++) ) {
        print (" <tr>\n".
            " <td><a href=\"info.php?id=$id\">$name</a></td>\n" .
            " <td>$salary</td>\n" .
            " </tr>\n") ;
            }
            ?>
</table>

8.3.1 1 . Продвижение внутреннего указателя: next

mixed next (array array)

Возвращает элемент массива, следующий за текущим внутренним указателем массива, либо false, если указатель уже установлен на последний элемент массива.

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

примечание
       Если массив содержит пустые элементы или элементы с нулевым ключом, функция next() может вернуть для этих элементов false. Чтобы организовать корректный обход таких массивов, необходимо воспользоваться функцией each() (см. раздел 8.3.4).

8.3.12. Извлечение текущего элемента: pos

mixed pos (array array)

Представляет собой синоним функции current () (см. раздел 8.3.3).

8.3.13. Предыдущий элемент массива: prev

mixed prev (array array)

Возвращает элемент массива, следующий перед текущим внутренним указателем массива, либо false, если указатель уже установлен на первый элемент массива.

назад
далее

Сайт управляется системой uCoz