Файл: Опорний_конспект.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 24.05.2024

Просмотров: 115

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

[2] => Війна й мир )

Приклад 7.8. Допустимо, ми створюємо каталог описів документів. У кожного документа є автор, назва, дата публікації й короткий зміст. Ми вже не раз відображали описи, складені із цих характеристик. Щораз порядок відображення цих елементів залежав від створеної нами програми. Тепер же ми хочемо мати можливість змінювати порядок відображення елементів за бажанням користувача. Складемо для цього наступну форму:

<form action=task.php> <table border=1>

<tr><td>Назва </td><td><input type=text name=title size=5> </td></tr>

<tr><td>Короткий зміст </td><td><input type=text name=description size=5>

</td></tr>

<tr><td>Автор </td><td><input type=text name=author size=5> </td></tr>

<tr><td>Дата публікації </td><td><input type=text name=published size=5>

</td></tr>

</table>

<input type=submit value="Відправити">

</form>

Приклад 7.8a. Форма для приклада 7.8

Будемо впорядковувати дані, передані цією формою, по убуванню їхніх значень, зберігаючи при цьому значення ключів. Для цього зручно скористатися функцією arsort() . Оскільки нам важливий тільки новий порядок елементів, збережемо в новому масиві ключі вихідного масиву в потрібному порядку. Ми зберігаємо ключі вихідного масиву, оскільки вони є іменами елементів, з яких конструюється опис документа, а пам'ятати їх важливо. Отже, одержуємо такий скрипт:

<?php

print_r($_GET); echo "<br>"; arsort ($_GET);

//сортуємо масив у зворотному порядку, зберігаючи ключі print_r($_GET); echo "<br>";

$ordered_names = array_keys($_GET);

//становимо новий масив

foreach($ordered_names as $key => $val) echo "$key :$val <br>";

// виводимо елементи нового масиву

?>

Приклад 7.8b. Програма обробки форми із приклада 7.8

Сортування масиву по ключах

Очевидно, що може виникнути необхідність у сортуванні масиву за значеннями ключів. Наприклад, якщо в нас є масив даних про книги, як у наведеному вище прикладі, то цілком імовірно, що ми захочемо відсортувати книги по іменах авторів. Для цього в PHP також не потрібно писати багато рядків коду - можна просто скористатися функцією ksort() для сортування по зростанню

89

(прямій порядок сортування ) або krsort() - для сортування по убуванню (зворотний порядок сортування ). Синтаксис цих функцій знову ж аналогічний синтаксису функції sort() .

<?php

$books = array("Пушкін"=>"Руслан і Людмила", "Толстой"=>"Війна й мир", "Лермонтов"=>"Герой нашого часу");

ksort($books);

// сортуємо масив, зберігаючи значення ключів print_r($books);

?>

Приклад 7.9. Сортування масиву по ключах

Одержимо:

Array ( [Лермонтов] => Герой нашого часу [Пушкін] => Руслан і Людмила [Толстой] => Війна й мир )

Сортування за допомогою функції, заданої користувачем

Крім двох простих способів сортування значень масиву (по убуванню або по зростанню) PHP пропонує користувачеві можливість самому задавати критерії для сортування даних. Критерій задається за допомогою функції, ім'я якої вказується як аргумент для спеціальних функцій сортування usort() або uksort() . По назвах цих функцій можна догадатися, що usort() сортує значення елементів масиву, а uksort() - значення ключів масиву за допомогою заданої користувачем функції. Обидві функції повертають true, якщо сортування пройшло успішно, і false - у противному випадку. Їхній синтаксис виглядає в такий спосіб:

usort (масив , що сортує функція) uksort (масив , що сортує функція)

Звичайно ж, не можна сортувати масив за допомогою будь-якої користувальницької функції. Ця функція повинна задовольняти певним критеріям, що дозволяють порівнювати елементи масиву. Як повинна бути влаштована функція, що сортує? По-перше, вона повинна мати два аргументи. У них інтерпретатор буде передавати пари значень елементів для функції usort() або ключів масиву для функції uksort() . По-друге, що сортує функція повинна повертати:

ціле число, менше нуля, якщо перший аргумент менше другого;

число, рівне нулю, якщо два аргументи рівні;

число більше нуля, якщо перший аргумент більше другого.

Як і для інших функцій сортування, для функції usort() існує аналог, що не змінює значення ключів, - функція uasort() .

Приклад 7.10. Допустимо, у нас є масив, що містить такі відомості про літературні твори, як назва, автор і рік створення. Ми хочемо впорядкувати книги по даті створення.

<?php

// масив виглядає в такий спосіб:

90



$books = array("Герой нашого часу" => array ("Лермонтов", 1840), "Руслан і Людмила" => array("Пушкін",1820), "Війна й мир" => array ("Толстой",1863),

"Ідіот" => array("Достоєвський",1868));

/* можна, звичайно переписати цей масив по-іншому, зробивши рік видання, наприклад, індексом, але набагато зручніше написати свою функцію для сортування */

uasort($books,"cmp");

//сортуємо масив за допомогою функції cmp foreach ($books as $key => $book) {

echo "$book[0]: \"$key\"<br>";

}

function cmp($a,$b){

//функція, що визначає спосіб сортування if ($a[1] < $b[1]) return -1;

elseif ($a[1]==$b[1]) return 0; else return 1;

}

?>

Приклад 7.10. Сортування за допомогою користувальницьких функцій

У результаті одержимо:

Пушкін: "Руслан і Людмила" Лермонтов: "Герой нашого часу" Толстой: "Війна й мир" Достоєвський: "Ідіот"

Ми застосували нашу власну функцію сортування до всіх елементів масиву. Далі розглянемо, як застосувати до елементів масиву будь-яку іншу користувальницьку функцію.

Застосування функції до всіх елементів масиву

Функція array_walk(масив, функція [, дані]) застосовує створену користувачем функцію до всіх елементів масиву масив і повертає true у випадку успішного виконання операції й false - у противному випадку.

Користувацька функція, як правило, має два аргументи, у які по черзі передаються значення й ключ кожного елемента масиву. Але якщо при виклику функції array_walk() зазначений третій аргумент, то він буде розглянутий як значення третього аргументу користувацької функції, зміст якого визначає сам користувач. Якщо функція користувача вимагає більше аргументів, чим у неї передано, то при кожному виклику array_walk() буде видаватися попередження.

Якщо необхідно працювати з реальними значеннями масиву, а не з їхніми копіями, варто передавати аргумент у функцію по посиланню. Однак потрібно мати на увазі, що не можна додавати або видаляти елементи масиву й робити дії, що змінюють сам масив, оскільки в цьому випадку результат роботи array_walk() уважається невизначеним.

91

<?php

$books1 = array("А.С. Пушкін"=>"Руслан і Людмила", "Л.Н. Толстой"=>"Війна й мир", "М.Ю. Лермонтов"=>"Герой нашого часу");

//створюємо функцію, що хочемо застосувати до елементів масиву function try_walk($val,$key,$data){

echo "$data \"$val\" написав $key<br>";

}

//застосовуємо до всіх елементів масиву $books1 функцію try_walk array_walk($books1,"try_walk","Роман");

?>

Приклад 7.11. Застосування функції до всіх елементів масиву

У результаті роботи скрипта одержимо:

Роман "Руслан і Людмила" написав А.С. Пушкіна Роман "Війна й мир" написав Л.Н. Толстой Роман "Герой нашого часу" написав М.Ю. Лермонтов

Помітимо, що ми не змінили значень елементів масиву. Щоб їх змінити, треба було передавати значення в змінну $val функції try_walk по посиланню.

<?php

$books1 = array(

"А.С. Пушкін"=>"Руслан і Людмила", "Л.Н. Толстой"=>"Війна й мир", "М.Ю. Лермонтов"=>"Герой нашого часу");

// створюємо функцію, що хочемо застосувати до елементів масиву

function try_walk(&$val,$key){ $key = "<p>Автор: " .$key ."<br>";

$val = "Назва: \"" . $val ."\"</p>"; echo $key.$val;

}

// застосовуємо до всіх елементів масиву $book1 функцію try_walk

array_walk($books1,"try_walk"); print_r($books1);

?>

Приклад 7.12. Застосування функції до всіх елементів масиву. Варіант 2

У результаті роботи скрипта одержимо:

Автор: А.С. Пушкін Назва: "Руслан і Людмила"

92


Автор: Л.Н. Толстой

 

Назва: "Війна

й мир"

 

Автор: М.Ю. Лермонтов

 

Назва: "Герой

нашого часу"

 

Array ( [А.С.

Пушкін] => Назва: "Руслан і

Людмила"

[Л.Н.

Толстой] => Назва: "Війна й

мир"

[М.Ю.

Лермонтов] => Назва: "Герой

нашого часу")

5 Виділення підмасива

Функція array_slice

Оскільки масив - це набір елементів, цілком імовірно, буде потрібно виділити з нього якийнебудь піднабір. В PHP для цих цілей є функція array_slice . Її синтаксис такий:

array_slice (масив, номер_елемента [, довжина])

Ця функція виділяє якого заданий параметром елемента відносно початку

підмасив довжини довжина в масиві масив, починаючи з елемента, номер номер_елемента. Позитивний номер_елемента вказує на порядковий номер масиву, негативний - на номер елемента з кінця масиву.

<?php

$arr = array(1,2,3,4,5); $sub_arr = array_slice($arr,2); print_r($sub_arr);

/* виведе Array ( [0] => 3 [1] =>4 [2] => 5 ), тобто підмасив, що складається з елементів 3, 4, 5 */

$sub_arr = array_slice($arr,-2); print_r($sub_arr);

// виведе Array ( [0] => 4 [1] => 5 ), тобто підмасив, з елементів 4, 5

?>

Приклад 7.13. Використання функції array_slice()

Якщо задати параметр довжина при використанні array_slice , то буде виділений підмасив, що має рівно стільки елементів, скільки задано цим параметром. Довжину можна вказувати й негативну. У цьому випадку інтерпретатор видалить із кінця масиву число елементів, рівне модулю параметра довжина.

<?php

$arr = array(1,2,3,4,5);

$sub_arr = array_slice($arr, 2, 2);

//містить масив з елементів 3, 4 $sub = array_slice($arr,-3, 2);

//теж містить масив з елементів 3, 4 $sub1 = array_slice($arr,0, -1);

//містить масив з елементів 1, 2, 3, 4 $sub2 = array_slice($arr,-4, -2);

//містить масив з елементів 2, 3

93


?>

Приклад 7.14. Використання функції array_slice(). Варіант 2

Функція array_chunk

Є ще одна функція, схожа на array_slice() - це array_chunk() . Вона розбиває масив на декілька підмасивів заданої довжини. Синтаксис її такий:

array_chunk ( масив, розмір [, зберігати_ключі])

У результаті роботи array_chunk() повертає багатомірний масив, елементи якого являють собою отримані підмасиви. Якщо задати параметр зберігати ключі як true, то при розбивці будуть збережені ключі вихідного масиву. У противному випадку ключі елементів заміняються числовими індексами, які починаються з нуля.

Приклад 7.15.У нас є список запрошених, оформлений у вигляді масиву їхніх прізвищ. У нас є столики на три персони. Тому потрібно розподілити всіх запрошених по три.

<?php

$persons = array("Іванов", "Петров", "Сидорова", "Зайцева", "Волкова"); $triples = array_chunk($persons,3);

//ділимо масив на підмасиви по три елемента foreach ($triples as $k => $table){

//виводимо отримані трійки

echo "За столиком номер $k сидять: <ul>"; foreach ($table as $pers)

echo "<li>$pers"; echo "</ul>";

}

?>

Приклад 7.15. Використання функції array_chunk()

У результаті одержимо:

за столиком номер 0 сидять:

Іванов

Петров

Сидорова

за столиком номер 1 сидять:

Зайцева

Волкова

Сума елементів масиву

У цьому розділі ми познайомимося з функцією, що обчислює суму всіх елементів масиву. Саме завдання обчислення суми значень масиву гранично просте. Але навіщо писати зайвий раз той самий код, якщо можна скористатися спеціально створеною й завжди доступною функцією. Функція

94

ця називається, як можна догадатися, array_sum() . І як параметр їй передається тільки ім'я масиву, суму значень елементів якого потрібно обчислити.

Як приклад використання цієї функції приведемо рішення більше складного завдання, чим просте обчислення суми елементів. Цей приклад також ілюструє застосування функції array_slice(), що ми обговорювали декілька раніше.

Приклад 7.16.Нехай даний масив натуральних чисел. Потрібно знайти в ньому таке число, що сума елементів праворуч від нього дорівнює сумі елементів ліворуч від нього.

<?php

//масив задається функцією array $arr = array(2,1,3,4,5,6,4);

/* перебираємо кожен елемент масиву $arr. Усередині циклу поточний ключ масиву утримується в змінної $k, поточне значення - у змінної $val */

foreach ($arr as $k => $val){ $p = $k + 1;

/* синтаксис array array_slice (array array,int offset [,int length]) array_slice

виділяє підмасив довжини length у масиві array, починаючи з елемента offset. */ $out_next = array_slice($arr,$p);

// одержуємо масив елементів, що йдуть після поточного $out_prev = array_slice($arr,0,$k);

/* одержуємо масив елементів, що йдуть перед поточного функція mixed array_sum (array array) підраховує суму елементів масиву array */

$next_sum = array_sum($out_next); $prev_sum = array_sum($out_prev);

/* якщо сума елементів до поточного дорівнює сумі елементів після, те виводимо значення поточного елемента */

if ($next_sum==$prev_sum) echo "value:$val";

echo "<hr>";

}

?>

Приклад 7.16. Програма пошуку числа, такого що сума елементів праворуч від нього дорівнює сумі елементів ліворуч від нього

Висновок

Отже, підведемо підсумки. У цій лекції ми вивчили ряд функцій, що спрощують роботу з масивами даних. Ми розглянули функції для пошуку значення серед елементів масиву; функції для сортування елементів масиву, як по їхніх значеннях, так і по ключах ; функції, що дозволяють застосовувати до всіх елементів масиву функцію, створену користувачем. Крім того, ми вивчили функцію, що виділяє підмасиви з елементів масиву, і функцію, що обчислює суму всіх елементів масиву. Використання всіх цих функцій було продемонстровано на прикладах. Всі функції для роботи з масивами доступні без яких-небудь конфігураційних настроювань PHP, і користуватися ними можна абсолютно вільно. Так що, перш ніж винаходити велосипед, загляньте в посібник з мови PHP: - цілком можливо, що хтось зробив це до вас.

95