Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PI_lektsii_2016.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
6.12 Mб
Скачать

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

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

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

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

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

<?php

$books1 = array(

"О.С. Пушкін"=>"Руслан і Людмила",

"Л.Н. Толстой"=>"Війна і мир",

"М.Ю. Лермонтов"=>"Герой нашого часу");

// створюємо функцію, яку хочемо

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

function try_walk($val,$key,$data)

{

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

}

// застосувати до всіх елементів масиву

// $ books1 функцію try_walk

array_walk($books1,"try_walk","Роман");

?>

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

Роман "Руслан і Людмила" написав А.С. Пушкін

Роман "Війна і мир" написав Л.М. Толстой

Роман "Герой нашого часу" написав М.Ю. Лермонтов

Зауважимо, що ми не змінили значень у елементів масиву. Щоб їх змінити, треба було передавати значення в змінну $ 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);

?>

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

Автор: А.С. Пушкін

Назва: "Руслан і Людмила"

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

Назва: "Війна і мир"

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

Назва: "Герой нашого часу"

Array ([А.С. Пушкін] => Назва: "Руслан і Людмила"

[Л.Н. Толстой] => Назва: "Війна і мир"

[М.Ю. Лермонтов] => Назва: "Герой нашого часу")

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

Функція 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

?>

Якщо задати параметр довжина при використанні 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

?>

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

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

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

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

<?php

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

// ділимо масив на підмасиви по три елемента

$triples = array_chunk($persons,3);

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

foreach ($triples as $k => $table)

{

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

foreach ($table as $pers) echo "<li>$pers"</li>;

echo "</ul>";

}

?>

В результаті отримаємо:

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

• Іванов

• Петров

• Сидорова

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

• Зайцева

• Волкова

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

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

<?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";

// можна подивитися, що являють собою

// розглянуті масиви на кожному кроці

// print_r($out_next); echo "<br>";

// print_r($out_prev);

// echo "$next_sum, $prev_sum<br>";

echo "<hr>";

}

?>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]