Массивы и списки.

Понятие массива.

Массив - это упорядоченный набор данных. Каждый элемент массива имеет индекс и ключ. Индекс (ключ) служит для однозначной идентификации элемента внутри массива. В одном массиве не может быть двух элементов с одинаковыми индексами.

В PHP - длину массива не нужно задавать при объявлении массива, длина будет автоматически увеличена при добавлении нового элемента в массив. Простейший способ инициализации массива:

$people[0] = "Коля";

$people[1] = "Витя";

$people[2] = "Дима";

$people[3] = "Марк";

PHP определяет массив по квадратным скобкам. В квадратных скобках указывается индекс (ключ) отдельного элемента массива. В приведенном примере массив - $people, состоящий из четырех элементов. В PHP размер массива не задается явно.

Обратиться к элементу массива можно по имени массива и индексу элемента внутри массива:

echo $people[1];

Зная количество элементов массива, можно вывести все элементы массива с помощью цикла:

for ($i=0; $i<количество; $i++) echo "people[$i] <br>";

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

for ($i=0; $i<count($people); $i++) echo "$people[$i] <br>";

Понятие списка.

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

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

Массивы, индексами которых являются строки, называются ассоциативными. Индексы ассоциативных массивов называются ключами. Например:

$people["Иванов"] = "Иван";

$people["Сидоров"] = "Николай";

$people["Петров"] = "Петр";

Доступ к элементам ассоциативных массивов осуществляется так же, как и к элементам обыкновенных массивов, и называется доступом по ключу:

echo $people["Иванов"];

Инструкция list().

Пример: имеем массив, состоящий из трех элементов:

$people[0] = "Иван";

$people[1] = "Николай";

$people[2] = "Петр";

Необходимо передать эти значения элементов массива, соответственно, трем переменным $Ivanov, $Sidorov, $Petrov:

list ($Ivanov,$Sidorov,$Petrov) = $people; 

Инструкция array() и создание многомерных массивов.

Инструкция array() используется специально для создания массивов. При этом она позволяет создавать пустые массивы.

Методы использования инструкции array():

$A = array (); // создает пустой массив

$A = array ("Иванов"=>"Иван", "Петров"=>"Петр"); // создает ассоциативный массив с двумя элементами

$A = array ("Иванов","Петров"); // создает список с двумя элементами. Индексы нумеруются с нуля.

Инструкцию array() удобно использовать при создании многомерных массивов.

Пример: создать массив, элементами которого будут ассоциативные массивы с ключами name, sex, email.

$A["Ivanov"] = array("name"=>"Иванов И.", "sex"=>"М", "email"=>"ivanov@mail.ru");

$A["Petrov"] = array("name"=>"Петров И.", "sex"=>"М", "email"=>"petrov@mail.ru");

$A["Sidorova"] = array("name"=>"Сидорова Н.", "sex"=>"F", "email"=>"sidorova@mail.ru");

Добраться до элементов массива можно так:

echo $A["Ivanov"]["name"]; // выведет Иванов И.

echo $A["Ivanov"]["email"]; // выведет ivanov@mail.ru

Удаление массивов.

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

Unset ($people);

Слияние массивов.

Стандартное слияние.

Слияние (конкатенация) - это операция создания массива, состоящего из элементов нескольких других массивов. Слияние реализуется с помощью оператора +.

Пример: имеется два массива.

$A = array ("1"=>"первый","2"=>"второй");

$B = array("3"=>"третий","4"=>"четвертый");

Процесс слияния:

$C = $A + $B;

В результате:

"1"=>"первый","2"=>"второй","3"=>"третий","4"=>"четвертый"  // именно в таком порядке

Особенно внимательными нужно быть при слиянии списков. Пример:

$A = array (10,11,12);

$B = array (15,17,18);

$C = $A + $B;

В результате:  10,11,12 т. к. при слиянии массивов, в которых содержатся элементы с одинаковыми индексами (ключами), в результирующем массиве останется элемент первого массива, причем на том же самом месте.

Слияние с помощью функции array_merge().

Функция array_merge() предназначена для слияния массивов. Она устраняет все недостатки оператора +.

Функция array_merge() соединяет массивы переданные ей в качестве аргументов в один большой массив. Если в соединяемых массивах встречаются одинаковые ключи (ключ=>значение), то в результирующий массив помещается пара ключ=>значение из массива, который стоит правее в списке аргументов функции array-merge().

Пример:

$A = array(10,11,12);

$B = array(15,17,18);

$C = $A + $B;   // $C = array(10,11,12);

$C = array_merge($A,$B);  // $C = array (10,11,12,15,17,18);

Таким образом, функцию array_merge() очень удобно использовать для слияния списков.

Перебор массива.

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

Принцип косвенного перебора заключается в том, что сначала вычисляется очередной индекс (ключ), а затем по этому индексу косвенно находится значение элемента массива. Например:

$people[0]="Коля";

$people[1]="Витя";

$people[2]="Дима";

for ($i=0; $i<count($people); $i++) echo "$people[$i] <br>";

Пояснения:  цикл for перебрал индексы ( целые числа), последовательно увеличивая их на 1, и по индексам получил  элементы массива.

Для ассоциативного массива, индексом которого является строка:

$people["Иванов"] = "Иван";

$people["Сидоров"] = "Николай";

$people["Петров"] = "Петр";

Перебор такого массива поможет следующий цикл:

for (Reset($people); ($k = key($people)); Next ($people));

echo "$k = $people[$k] <br>";

Пояснения: функция Reset() устанавливает текущий элемент массива $people[ ] на первую позицию. Функция key()  возвращает ключ текущего элемента. Если нет больше элементов в массиве, то эта функция возвратит 0, и цикл прекратиться. Функция Next() перемещает текущий элемент на одну позицию вперед.

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

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

foreach ($people as $key => $value) echo "$key = $value";

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

Основные функции для сортировки массивов:

Сортировка массива по значению. Функции asort() и arsort()

Функция asort() выполняет сортировку массива по значениям элементов. При этом она располагает элементы массива таким образом, что их значения идут в алфавитном порядке (если это строки) или в возрастающем порядке (если это числа).

 Функция arsort() выполняет сортировку в обратном порядке.

Пример: имеется массив

$FIO = array("Sidorov"=>"Nikolay", "Ivanov"=>"Alexandr", "Petrov"=>"Petr");

После выполнения функции asort($FIO) массив будет преобразован следующим образом:

array("Ivanov"=>"Alexandr", "Sidorov"=>"Nikolay", "Petrov"=>"Petr");

Сортировка массива по ключам. Функции ksort() и krsort()

Для сортировки по ключам используется функция ksort(). При этом сортировка осуществляется по таким же принципам, что и функцией asort(), только не по значению, а по ключам. В результате обработки массива $FIO получаем:

array("Ivanov"=>"Alexandr", "Petrov"=>"Petr", "Sidorov"=>"Nikolay");

Для сортировки ключей в обратном порядке используется функция krsort().

Сортировка списка.

Функции asort(), arsort(), ksort() и krsort() не разрывают пары ключ=>значение. Это очень важно. Например: имеем небольшой список:

$people = array("Ivanov"=>"555-6677", "Sidorov"=>"345-4567", "Petrov"=>"777-5653");

после сортировки массива по ключам, список выглядит так:

$people = array("Ivanov"=>"555-6677", "Petrov"=>"777-5653", "Sidorov"=>"345-4567");

Пары ключ=>значение не разорваны!!! Если необходимо отсортировать список, то удобнее использовать функцию sort(). Данная функция разрывает пары ключ=>значение, поэтому она используется только для списков. Например: имеется список

$List = array("Name", "Address", "Email");

Если вывести список в виде ключ=>значение, получим следующий результат:

0 => Name

1 => Address

2 => Email

После сортировки sort() имеем следующий список:

0 => Address

1 => Email

2 => Name

Переворачивание массива. Функция array_reverse()

Для переворачивания массива используется функция array_reverce(). Она возвращает массив в обратном порядке относительно исходного массива. Например, чтобы отсортировать массив в обратном порядке, можно использовать функцию arsort(), а можно упорядочить массив в прямом порядке функцией asort() и перевернуть его функцией array_reverce().

Перемешивание списков. Функция shuffle()

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

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

mt_srand(time()*100000);

shuffle($Arr);

Пользовательская сортировка массивов. Функции uksort(), uasort() и usort()

Когда необходимо отсортировать массив не в алфавитном порядке, а по более сложному критерию, применяются функции uksort(), uasort() и usort() - пользовательские функции сортировки массивов. Каждой функции нужно передать два параметра:

Функции сравнения нужно передать два параметра - два элемента массива ($e1_1  и $e1_2).  В свою очередь, функция должна возвратить одно из трех значений:

-1, если $e1_1<$el_2;

0, если $el_!=$1_2;

1, если $e1_1>$e1_2

Пример: имеем список файлов и каталогов - $FilesDirs. Необходимо вывести сначала каталоги, а потом файлы. Сравнение проводится функцией cmp(), листинг которой имеет вид:

function cmp($e1_1, $1_2)

{

// Сначала каталог, а потом - файл

if (is_dir($e1_1) && !is_dir($e1_2)) return -1;

if (!is_dir($e1_1) && is_dir($1_2)) return 1;

// Сравниваем по алфавиту

if($e1_1<$e1_2) return -1;

    elseif ($e1_1>$e1_2) return 1;

        else return 0;

}

Вызовем функцию uasort():

uasort($FilesDirs, "cmp");

Функция uasort() аналогична функции uksort(), только она сортирует не ключи, как uksort(), а значения. Обе функции - uksort() и uasort() - сохраняют пары ключ=>значение.

Получение части массива.

Для получения части массива используется функция array_slice(). Ей нужно передать три параметра:

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

Примеры:

$A = array (xox, ror, tot, pop, mom);  //задаем исходный массив

$B = array_slice ($A,2);  //получаем массив $B,

                                        //в котором содержатся все элементы массива $A, начиная с третьей позиции (т.к. два надо пропустить).

                                        //Таким образом массив $B будет содержать элементы tot, pop, mom.

$B = array_slice ($A, 0 , 2);    //Получаем массив $B, в котором содержатся два элемента массива $A, начиная с первого (т.к.

                                                //надо пропустить 0 элементов). Т.о. массив $B будет содержать элементы xox, ror.

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

$B = array_slice ($A, 2,-1);    //получаем массив $B, состоящий из элементов tot, pop.

Функция array_slpice() похожа на функцию array_slice(). Ей нужно передать еще один параметр - массив (для примера $R). Как и array_slice(), функция array_splice() возвращает массив указанной длины, начиная со смещения $offset, но и заменяет переданные ей элементы на содержимое массива $R.

Пример: (вместо массива $R можно указать обыкновенное строковое значение).

$A = array ("Audi", "Mersedes", "Toyota",  "Honda", "Renault");

array_splice ($A, 1, count($A), "BMW");

    // $A = array ("Audi", "BMW");

Добавление и удаление части массива.

Добавление в конец массива. Функция array_push()

Функция array_push() добавляет элементы в конец массива точно так же как и оператор [ ]. Например, следующие операторы аналогичны:

$A[ ] = 5;

array_push ($A,5);

Если необходимо добавить один элемент в массив (как в приведенном примере), то удобнее использовать оператор [ ]. Использование оператора array_push() оправдывает себя тогда, когда нужно добавить в конец массива несколько новых элементов. Например:

$A[ ] = 5;

$A [ ] = 7;

$A [ ] = 9;

$A [ ] = 10;

$A [ ] = 15;

Вместо этого можно записать:

array_push ($A, 5,7,9,10,15);

Удаление последнего элемента списка. Функция array_pop()

Функция array_pop() противоположна функции array_push(), она возвращает значение последнего элемента массива и удаляет его из списка.

Функции array_pop() нужно передать всего один параметр - имя массива (списка):

$A = array (xox, ror, tot, pop, mom);

$T = array_pop ($A);  //переменной $T присвоили значение mom, а массив $A лишился этого последнего элемента и теперь состоит из элементов xox, ror, tot, pop.

array_pop($A);  //массив $A еще раз лишился последнего элемента и теперь состоит из xox, ror, tot.

Добавление в начало массива. Удаление первого элемента списка.

Функции array_unshift() и array_shift() похожи на функции array_push() и array_pop(), но только работают не с концом списка, а с его началом.

Функция array_unshift() добавляет элементы в начало списка, а функция array_shift() возвращает значение первого элемента списка и удаляет его из списка:

$A = array (3,4,5,);

array_unshift($A,1,2);    //получаем $A = array (1,2,3,4,5)

array_shift($A);  //получаем $A = array(2,3,4,5);

Функция array_unique()

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

$Arr = array ("a=>"AAA", "b"=>"BBB", "c", "d", "e"="BBB", "d");

$Unique_Arr = array_unque ($Arr);  //$Unique_Arr = array ("a"=>"AAA", "b"="BBB", "c","d");

Переменные и массивы. Взаимные переходы.

Упаковка переменных в массив. Функция compact()

Функция compact() -"упаковывает" переменные и их значения в массив. В результате получается ассоциативный массив, ключами которого являются имена переменных, а значениями элементов - значения переменных. Например, имеем две переменные:

$Name = "Вася";

$Email = "vasya@vvv.org";

Функция compact("Name", "Email") упакует переменные в один массив:

$A = compact ("Name", "Email");  //получаем $A = array("Name"=>"Вася", "Email"=>"vasya@vvv.org");

Распаковка (извлечение) переменных из массива. Функция extract()

Функция extract() - противоположна функции compact(). Она действует "с точностью до наоборот", то есть создает переменные с именами, соответствующими именами ключей и присваивает им значения элементов массива. Распакуем массив:

extract($A);

В процессе распаковки может оказаться, что уже существует переменная с именем, как имя ключа в массиве $A. Для решения этой проблемы у функции extract() предусмотрен второй параметр, который позволяет определить поведение функции extract() в случае совпадения имен. Значение EXTR_OVERWRITE означает, что существующая переменная с именем ключа будет перезаписана, а EXTR_SKIP - пропущена:

$Name = "Вася";

$Email = "vasya@vvv.org";

$A = compact ("Name", "Email");

$Name = "Ivan";

extract ($A, EXTR_OVERWRITE);  //$Name = "Ivan", так как мы указали EXTR_OVERWRITE

Значение EXTR_WRITE используется по умолчанию и может не указываться, т.е. достаточно указать extract($A) и все переменные будут перезаписаны.

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

Иногда нужно создать диапазон чисел, например, для нумерации записей в выбранной таблице. Пример создания диапазона чисел:

$List = array();

for ($i=10; $i<=100; $i++) $List[ ]=$i;

Данный цикл создает список, заполненный целыми числами от 10 до 100 включительно. В PHP можно обойтись проще - одним вызовом функции range(10,100).

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

Hosted by uCoz