CodeNix

692378482

codenix.sv

admin@codenix.net

Масиви (array) в PHP

Опубліковано: Категорія: PHP Переглядів: 2268

php типи даних масиви

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

Масиви PHP нетипізовані, це означає, що елементи масиву можуть мати будь-який тип, причому різні елементи в масиві можуть мати різні типи. Крім цього масиви PHP є динамічними, це означає, що фіксований розмір оголошувати не потрібно і нові елементи можна дабавляти в будь-який час.

Основні відомості про масиви

Щоб працювати з масивами, вам потрібно освоїти два нових поняття: елементи та індекси. Елементи - це значення, що зберігаються в масиві, значення можуть бути абсолютно будь-якого типу. До кожного елементу можна звернутися за його унікальним індексом. В якості індексу може використовуватися ціле число або рядок.

Масиви можна розділити на два типи: індексні, у яких в якості значення індексу використовується тільки ціле число і асоціативні, де значенням індексу може бути як рядок так і число. Часто в асоціативних масивах індекс називається:  "ключ".

Індексні масиви зазвичай називають просто "масивами", а асоціативні масиви - "асоціативними".

Створення масиву

У PHP є три способи створення масивів. Перший спосіб - це створення за допомогою спеціальної функції array(). В якості аргументів функція приймає будь-яку кількість пар ключ => значення (key => value) розділених комами або просто значення, також розділені комами. Вона повертає масив, який можна привласнити змінній.

// Створення масива с числовими індексами  
$weekdays = array('Понеділок','Вівторок','Середа',
                  'Четвер','П\'ятниця','Субота',
                  'Неділя');
// Виведе: array(7) { [0]=> string(18) "Понеділок" [1]=> string(16) "Вівторок" [2]=> string(12) "Середа" [3]=> string(12) "Четвер" [4]=> string(15) "П'ятниця" [5]=> string(12) "Субота" [6]=> string(12) "Неділя" }
var_dump($weekdays);

Так як вказувати ключ не обов'язково, значення можна додавати в масив без його вказівки. Якщо ключ не вказується, PHP буде використовувати числові індекси. За замовчуванням елементи будуть нумеруватися, починаючи з нуля. Масиви з числовими індексами дозволяють просто додати елемент, а PHP автоматично буде використовувати попереднє найбільше значення ключа типу integer, збільшене на 1.

Також можна вказувати ключ для окремих елементів:

$my_array = array( 'a',
                   'b',
              7 => 'c',
                   'd');

// Виведе: array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [7]=> string(1) "c" [8]=> string(1) "d" }
var_dump($my_array);

Тепер розглянемо створення аccоціатівного масиву за допомогою функції array(). Асоціативний масив записується трохи по іншому: для додавання елемента використовується формат ключ => значення.

// Створення асоціативного масиву
$shapes = array('Січень'   => '30',
                'Лютий'    => '28',
                'Березень' => '31',
                'Квітень'  => '30',
                'Травень'  => '31',
                'Червень'  => '30',
                'Липень'   => '31',
                'Серпень'  => '31',
                'Вересень' => '30',
                'Жовтень'  => '31',
                'Листопад' => '30',
                'Грудень'  => '31');

// Виведе: array(12) { ["Січень"]=> string(2) "30" ["Лютий"]=> string(2) "28" ["Березень"]=> string(2) "31" ["Квітень"]=> string(2) "30" ["Травень"]=> string(2) "31" ["Червень"]=> string(2) "30" ["Липень"]=> string(2) "31" ["Серпень"]=> string(2) "31" ["Вересень"]=> string(2) "30" ["Жовтень"]=> string(2) "31" ["Листопад"]=> string(2) "30" ["Грудень"]=> string(2) "31" }
var_dump($shapes);

Тепер розглянемо другий спосіб створення масиву: використання квадратних дужок [], замість спеціальної функції array():

$my_array = array('foo' => 'bar',
                    'bar' => 'foo');
 
// другой спосіб створення масива
$my_array = ['foo' => 'bar',
             'bar' => 'foo'];

Різниці між цими масивами ніякої немає, крім відмінності в написанні.

Зверніть увагу, в PHP масиви можуть містити ключі типів integer і string одночасно, тобто PHP не робить різниці між індексованими і асоціативними масивами.

Вибираючи ім'я для масиву, будьте уважні, щоб не використовувати ім'я, що збігається з ім'ям іншої змінної, так як вони поділяють загальний простір імен. Створення змінної з тим же ім'ям, що і у існуючого масиву, призведе до видалення масиву без виведення будь-яких попереджень.

Перетворення індексів

Як згадувалося на самому початку статті, ключ може бути одним з двох типів: string або integer. Тому ключі невідповідаючі одному з цих типів будуть перетворені:

  • Якщо в якості ключа виступає рядок, який містить число, то він буде перетворена до типу integer. Однак, якщо число є некоректним десятковим цілим, наприклад '09', то воно не буде перетворено в тип integer.
  • Число з плаваючою комою (float), також буде перетворено в integer - дрібна частина в цьому випадку відкидається. Наприклад, якщо значення ключа 5.4, воно буде інтерпретоване як 5.
  • Булевий тип (boolean) також буде перетворений в integer. Наприклад, якщо значення ключа true, то воно буде перетворено в 1, а ключ із значенням false відповідно буде перетворений в 0.
  • Якщо використовується тип NULL, він буде перетворений в порожній рядок.
  • Об'єкти і масиви не можуть бути використані в якості ключів.

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

Доступ до елементів масиву

Доступ до елементів масиву здійснюється за допомогою квадратних дужок в яких вказується індекс/ключ: array[index/key].

$my_array = array('Шоколад' => 'молочний',
                   2        => 'foo');
 
echo $my_array['Шоколад'], "<br>";  //виведе: молочний
echo $my_array[2];                  //виведе: foo

Ще один спосіб доступу до елементів масиву полягає у використанні прямого розіменування масиву.

function foo() {
   return array(1, 'hello world!', 3);
}
  
echo foo()[1]; // виведе: hello world!

Даний приклад показує, що можна звертатися до індексу масиву, що повертається в якості результату виклику функції або методу.

Додавання та видалення елементів масиву

Тепер, коли ви отримали основні поняття про масиви, розглянемо способи запису значень в масив. Існуючий масив може бути змінений явною установкою в ньому значень. Це виконується за допомогою присвоювання значень масиву.

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

$my_arr = array( 0 => 'ноль',
                 1 => 'один');
  
$my_arr[2] = 'два';
$my_arr[3] = 'три';
   

var_dump($my_arr);  // виведе: array(4) { [0]=> string(8) "ноль" [1]=> string(8) "один" [2]=> string(6) "два" [3]=> string(6) "три" }
   
// присвоювання без вказання індекса/ключа
$my_arr[] = 'чотири';
$my_arr[] = 'п\'ять';
   
var_dump($my_arr); // виведе: array(6) { [0]=> string(8) "ноль" [1]=> string(8) "один" [2]=> string(6) "два" [3]=> string(6) "три" [4]=> string(12) "чотири" [5]=> string(9) "п'ять" }

Для зміни певного значення, потрібно просто присвоїти нове значення вже існуючому елементу. Щоб видалити який-небудь елемент масиву з його індексом/ключем або видалити повністю сам масив, використовується функція unset():

$my_arr = array(10, 15, 20);
   
$my_arr[0] = 'Тест'; // змінюємо значення першого елемента
                 
unset($my_arr[1]);   // повністю видаляємо другий елемент из масиву
   
var_dump($my_arr);   //виведе: array(2) { [0]=> string(8) "Тест" [2]=> int(20) }
 
unset($my_arr);      //повністю видаляємо масив

Якщо елемент додається в масив без вказівки ключа, PHP автоматично буде використовувати попереднє найбільше значення ключа типу integer, збільшене на 1. Якщо цілочисельних індексів в масиві ще немає, то ключем буде 0 (нуль).

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

// Створюємо пустий масив з числовими індексами.
$my_arr = array(1, 2, 3);
print_r($my_arr); // виведе: Array ( [0] => 1 [1] => 2 [2] => 3 ) 
 
// Видаляємо всі елементи:
unset($my_arr[0]);
unset($my_arr[1]);
unset($my_arr[2]);
   
echo "<br>";
print_r($my_arr); // виведе: Array ( ) 
 
// Добавляємо елемент (зверніть увагу, що новим ключес буде 3, зімість 0).
$my_arr[] = 6;
   
echo "<br>";
print_r($my_arr); // виведе: Array ( [3] => 6 )
 
// Робимо переіндесацію:
$my_arr = array_values($my_arr);
$my_arr[] = 7;
   
echo "<br>";
print_r($my_arr); // виведе: Array ( [0] => 6 [1] => 7 )

Тепер ми можемо розглянути третій спосіб створення масивів:

// наступний запис створює масив
$weekdays[] = 'Понеділок'; 
$weekdays[] = 'Вівторок'; 
   
// те саме, але з вказанням  індексу
$weekdays[0] = 'Понеділок'; 
$weekdays[1] = 'Вівторок'; 

У прикладі був показаний третій спосіб створення масиву. Якщо масив $weekdays ще не був створений, то він буде створений. Однак такий вид створення масиву не рекомендується застосовувати, тому що якщо змінна $weekdays вже була раніше створена і містить значення, це може призвести до несподіваних результатів роботи сценарію.

Якщо у вас виникають сумніви з приводу того, чи є змінна масивом, скористайтеся функцією is_array().

Обхід масиву в циклі

Оператор циклу foreach здійснює послідовний перебір всіх елементів масиву. Він працює тільки з масивами і об'єктами, а в разі його використання зі змінними інших типів або неініціалізованими змінними буде згенерована помилка. Є два види синтаксису для даного циклу. Перший вид синтаксису виглядає наступним чином:

foreach ($array as $value) {
  ...
}

Цикл буде перебирати заданий масив - $array (замість $array підставляється назва масиву). На кожній ітерації значення поточного елемента присвоюється змінній $value (можна вказати будь-яке інше ім'я змінної). Оператор циклу foreach дуже зручний, оскільки сам виконує обхід і читання всіх елементів масиву, поки не буде досягнутий останній. Він дозволяє не тримати постійно в пам'яті той факт, що індексація масивів починається з нуля, і ніколи не виходить за межі масиву, що робить конструкцію циклу дуже зручною і допомагає уникнути поширених помилок.

Другий вид синтаксису foreach, виглядає так:

foreach ($array as $key => $value) {
  ...
}

При використанні даної форми синтаксису на кожній ітерації додатково присвоюється значення поточного ключа зміній $key (можна вказати будь-яке інше ім'я змінної).

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

// Виведе: 246
$my_arr = array(1, 2, 3);
foreach ($my_arr as &$value) {
  $value *= 2;
  echo $value;
}
   
/* це потрібне для того, щоб наступні записи в
змінну $value не змінювали останній елемент масиву */
unset($value);

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

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

Для будь-якого з типів: integer, float, string, boolean і resource, перетворення значення в масив дає результатом масив з одним елементом (з індексом 0), що є скалярним значенням, з якого ви почали.

$int = 58;
$str = 'str';
$bool = TRUE;

var_dump((array)$int); // виведе: array(1) { [0]=> int(58) } 
echo "<br>";
var_dump((array)$str); // виведе: array(1) { [0]=> string(3) "str" } 
echo "<br>";
var_dump((array)$bool); // виведе: array(1) { [0]=> bool(true) }

Якщо ви перетворите в масив об'єкт (object), ви отримаєте в якості елементів масиву властивості (змінні-члени) цього об'єкта. Ключами будуть імена змінних-членів, з деякими примітними винятками: цілочисельні властивості стануть недоступні; до закритих полів класу (private) спереду буде дописано ім'я класу; до захищених полів класу (protected) спереду буде додано символ '*'. Ці додані значення з обох сторін також мають нульові байти.

class A {
    private $Private = 15; 
    protected $Protected = 'str'; 
    public $Public;
}

var_dump((array) new A()); // виведе: array(3) { ["APrivate"]=> int(15) ["*Protected"]=> string(3) "str" ["Public"]=> NULL }

Якщо ви перетворите в масив значення NULL, ви отримаєте порожній масив.


Коментарі