Dữ liệu kiểu mảng (array) trong PHP | Tự học ICT

Mảng trong PHP là một trong những kiểu dữ liệu phức hợp. Tính phức hợp của kiểu mảng trong PHP thể hiện ở chỗ nó là tập hợp (collection) của dữ liệu có sắp xếp. Mỗi phần dữ liệu của một mảng gọi là một phần tử. Mỗi phần tử của mảng là một cặp khóa/giá trị (tương tự như một từ điển). Khóa có thể là số hoặc chuỗi. Giá trị có thể thuộc kiểu bất kỳ (thậm chí là một mảng khác).

Khái niệm mảng (array) trong PHP

Các kiểu dữ liệu trong PHP được phân chia làm hai loại chính: các kiểu giá trị (scalar) và các kiểu phức hợp (compound). Các kiểu giá trị bạn đã gặp bao gồm các kiểu số (integer, float), kiểu logic (boolean), chuỗi ký tự (string). Các kiểu dữ liệu phức hợp bao gồm mảng (array) và đối tượng (object).

Dữ liệu phức hợp phân biệt với giá trị ở chỗ dữ liệu phức hợp đóng vai trò “thùng chứa”. Trong đó mỗi “thùng chứa” thể chứa các dữ liệu khác, bao gồm cả giá trị và những “thùng chứa” nhỏ hơn. Ngược lại, mỗi giá trị tự bản thân nó là độc lập và không thể phân chia nhỏ hơn nữa.

Mảng trong PHP là một trong những kiểu dữ liệu phức hợp. Tính phức hợp của kiểu mảng trong PHP thể hiện ở chỗ nó là tập hợp (collection) của dữ liệu có sắp xếp. Mỗi phần dữ liệu của một mảng gọi là một phần tử. Mỗi phần tử của mảng là một cặp khóa/giá trị (tương tự như một từ điển). Khóa có thể là số hoặc chuỗi. Giá trị có thể thuộc kiểu bất kỳ (thậm chí là một mảng khác).

Bạn có thể hình dung mảng trong PHP như một loạt hộp carton dán nhãn đặt trong một thùng chứa lớn. Mỗi hộp carton là một phần tử. Nhãn của hộp là khóa, giúp bạn dễ dàng biết được trong hộp có gì để nhanh chóng tìm kiếm. Nhãn của mỗi chiếc hộp có thể chỉ đơn thuần là một con số (integer), hoặc có thể là các lời mô tả (string). Mỗi chiếc hộp có thể chứa bất kỳ thứ gì, thậm chí có thể chứa những chiếc hộp khác.

Như vậy mảng của PHP không thực sự giống mảng trong C#, C++ hay Java. Mảng trong PHP tương tự kiểu dữ liệu từ điển (dictionary), với mỗi phần tử là một cặp khóa => giá trị.

Phụ thuộc vào cách lựa chọn khóa, PHP phân biệt mảng chỉ số (indexed array) và mảng kết hợp (associative array). Mảng chỉ số có khóa là các số nguyên được gán tự động cho mỗi phần tử, trong đó chỉ số khóa bắt đầu từ giá trị 0. Mảng kết hợp sử dụng chuỗi ký tự làm khóa.

hai loại mảng trong phphai loại mảng trong php

Có thể hình dung mảng chỉ số như một dãy phần tử đánh số tự động, và bạn truy xuất phần tử theo số thứ tự của nó. Mảng kết hợp hình dung tương tự như một bảng dữ liệu hai cột, với một cột khóa và một cột giá trị tương ứng.

Cách tạo mảng trong PHP

PHP có hai cú pháp chính để tạo mảng: sử dụng hàm array() và sử dụng array literal (cặp ký tự []). Hai cách thức này là tương đương nhau.

Tạo mảng chỉ số

Để tạo mảng chỉ số, bạn chỉ cần liệt kê các giá trị trong lời gọi hàm array() hoặc bên trong cặp ký tự [] như sau:

// tạo một mảng chứa các địa chỉ mail sử dụng array() function
$emails = array('[email protected]', '[email protected]', '[email protected]');
// tạo một mảng chứa họ tên sử dụng array literal
$names = ['Trump D.', 'Obama B.', 'Bush G.', 'Clinton B.', ];

Hai cách trên là tương đương nhau. Bạn sử dụng cách nào cũng được.

Với cách tạo mảng như trên, PHP sẽ tự động gán chỉ số cho từng phần tử:

  • Trong mảng $emails, ‘trump@…’ có chỉ số 0, ‘obam@…’ có chỉ số 1, ‘bush@…’ có chỉ số 2.
  • Trong mảng $names, ‘Trump D.’ có chỉ số 0, ‘Obama B.’ có chỉ số 1, ‘Bush G.’ có chỉ số 2, ‘Clinton B.’ có chỉ số 3.

Việc đặt dấu phẩy sau phần tử cuối cùng không sai về cú pháp.

Tạo mảng kết hợp

Tương tự, chúng ta cũng có hai cách để xây dựng một mảng kết hợp.

// sử dụng array literal
$book1 = [
    'title' => 'PHP programming for expert',
    'authors' => 'Obama B.',
    'publisher' => 'The White house',
    'year' => 2013,
];
// sử dụng array function
$book2 = array(
    'title' => 'PHP programming for expert',
    'authors' => 'Obama B.',
    'publisher' => 'The White house',
    'year' => 2013
);

Dù sử dụng cách nào, bạn cần chỉ định rõ các cặp khóa giá trị theo cú pháp khóa => giá_trị. Các cặp khóa => giá_trị phân tách nhau bởi dấu phẩy.

Khóa có thể là số hoặc chuỗi ký tự. Giá trị có thể thuộc bất kỳ kiểu nào, kể cả mảng.

Bạn không nên sử dụng lại khóa (lặp khóa), mặc dù điều này không sai về cú pháp. Khi sử dụng lại khóa, cặp khóa => giá_trị tạo sau sẽ được sử dụng (và che đi cặp khóa => giá_trị ban đầu).

Việc đặt dấu phẩy ở sau cặp khóa => giá_trị cuối cùng mặc dù nhìn hơi bất thường nhưng đúng về cú pháp. Thậm chí nhiều người quen đặt như vậy để sau nhanh chóng bổ sung thêm phần tử mới.

Một số lưu ý khi tạo mảng trong PHP

Khi sử dụng hàm array() hoặc array literal [] mà không cung cấp giá trị gì, PHP sẽ tạo ra các mảng rỗng – mảng không có phần tử nào.

$empty1 = array();
$empty2 = [];

Bất kể sử dụng lối đánh chỉ số nào, mỗi mảng trong PHP đều có một hệ thống chỉ số nội bộ độc lập. Chỉ số nội bộ này không liên quan gì đến cách lựa chọn chỉ số (của mảng chỉ số) hay khóa (của mảng kết hợp).

Trên thực tế, sự phân biệt giữa mảng chỉ số và mảng kết hợp chỉ là hình thức:

  • Nếu bạn lờ đi một khóa/chỉ số, PHP sẽ tự động sinh ra giá trị khóa/chỉ số là số nguyên cho bạn.
  • Khi bạn bỏ qua việc tạo khóa/chỉ số trong mảng kết hợp (và để PHP tự động tạo theo quy tắc của nó), bạn thu được mảng chỉ số.
  • Bạn sẽ thu được mảng kết hợp nếu bạn chủ động tạo ra khóa số nguyên bắt đầu từ 0 – và đây cũng chính là một mảng chỉ số.

Như vậy, hai loại mảng thực chất là một, và bạn thậm chí có thể sử dụng lẫn cả chỉ số và khóa trong cùng một mảng (trộn lẫn chỉ số và khóa):

$mixed1 = array('color' => 'Red', 0 => 'Blue', 1 => 'Green');
$mixed2 = array('color' => 'Red', 'Blue', 'Green');

Trong mảng $mixed2, ‘Blue’ sẽ có chỉ số 0, ‘Green’ có chỉ số 1, trong khi ‘Red’ có chỉ số là chuỗi ‘color’.

Lối viết này không sai nhưng là một cách sử dụng XẤU. Bạn không nên xây dựng mảng như vậy.

Nếu muốn một mảng chỉ số với phần tử đầu tiên có chỉ số khác 0, bạn có thể làm như sau:

// mảng $days có phần tử đầu tiên lấy chỉ số 2, các phần tử tiếp theo sẽ có chỉ số 3, 4, 5, 6, 7, 8
$days = [2=> 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];

Mảng $days có phần tử đầu tiên lấy chỉ số 2, các phần tử tiếp theo sẽ có chỉ số từ 3 (Tuesday), .., 8 (Sunday). Logic ở đây rất đơn giản: PHP sẽ tự động lấy giá trị lớn nhất của các chỉ số có sẵn và lần lượt cộng thêm 1 để ra chỉ số của các phần tử tiếp theo.

Mảng của mảng và cấu trúc dữ liệu

Sức mạnh của mảng trong PHP đến từ việc nó có thể chứa bất kỳ thứ gì. Phần tử của mảng có thể là giá trị hoặc là một mảng khác. Đặc biệt, như bạn đã thấy ở trên, mảng kết hợp có thể dùng để lưu trữ nhiều loại thông tin với truy xuất qua từ khóa.

Do vậy, chúng ta có thể sử dụng mảng để diễn đạt các cấu trúc dữ liệu phức tạp tương tự như dữ liệu quan hệ.

Giả sử bạn cần lưu trữ thông tin về các cuốn sách điện tử.

Mỗi cuốn sách có thể bao gồm những thông tin về tựa sách (title), tác giả (authors), nhà xuất bản (publisher), năm xuất bản (year).

Nếu quen thuộc với lập trình hướng đối tượng, bạn có thể hình dung ra ngay cần xây dựng class riêng để mô tả cho sách, sau đó lập một mảng của các object này.

Trong PHP, ngay cả khi không cần đến object và lập trình hướng đối tượng bạn cũng có thể thực hiện được yêu cầu lưu trữ và xử lý dữ liệu như vậy với mảng. Bạn có thể dễ dàng tạo ra mảng kết hợp để lưu trữ các thông tin này:

[ // đây là ví dụ về lưu trữ thông tin của một cuốn sách
    'title' => 'PHP programming for expert',
    'authors' => 'Obama B.',
    'publisher' => 'The White house',
    'year' => 2013,
];

Giờ bạn cần lưu trữ (trong bộ nhớ) một danh sách dữ liệu sách. Bạn có thể lập một mảng với mỗi phần tử là một mảng kết hợp như trên.

Hãy xem ví dụ sau đây về cách sử dụng mảng để lưu trữ dữ liệu:

$books = array(
    [ // mỗi phần tử là một cuốn sách - là một mảng kết hợp
        'title' => 'PHP programming for dummy',
        'authors' => 'Trump D.',
        'publisher' => 'The White house',
        'year' => 2017
    ],
    [
        'title' => 'PHP programming for expert',
        'authors' => 'Obama B.',
        'publisher' => 'The White house',
        'year' => 2013
    ],
    [
        'title' => 'PHP programming for professional',
        'authors' => 'Bush G.',
        'publisher' => 'The White house',
        'year' => 2009
    ],
    [
        'title' => 'PHP programming for beginner',
        'authors' => 'Clinton B.',
        'publisher' => 'The White house',
        'year' => 2005
    ],
);

Đây là ví dụ về việc sử dụng mảng để lưu trữ cơ sở dữ liệu sách điện tử. Biến $books là một mảng chỉ số, với mỗi phần tử của nó là một mảng kết hợp.

Nói cách khác, $books là một mảng của mảng, trong đó mỗi phần tử (là một mảng) chứa thông tin về một cuốn sách:

    [ // đây là một mảng kết hợp
        'title' => 'PHP programming for professional',
        'authors' => 'Bush G.',
        'publisher' => 'The White house',
        'year' => 2009
    ]

Cấu trúc tương tự còn được sử dụng để lưu trữ dữ liệu lấy từ cơ sở dữ liệu quan hệ (như MySQL). Chúng ta sẽ học cách làm việc với MySQL trong phần cuối của series bài học này.

Một ví dụ khác là sử dụng mảng của mảng để tạo ra cấu trúc ma trận:

$matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
];

Trong ví dụ này, $matrix là một mảng chỉ số với 3 phần tử. Trong đó, mỗi phần tử lại là một mảng chỉ số khác (vở 4 phần tử). Cấu trúc này tạo ra một ma trận 3 hàng x 4 cột.

Truy xuất phần tử của mảng

Để truy xuất phần tử của mảng trong PHP bạn cần sử dụng phép toán [khóa|chỉ_số] trên biến mảng.

Truy xuất mảng chỉ số

Đối với mảng chỉ số, bạn cần cung cấp chỉ số trong phép toán này. Hãy xem các ví dụ sau:

$emails = array('[email protected]', '[email protected]', '[email protected]',);
echo $emails[0], $emails[1], $emails[2];
$names = ['Trump D.', 'Obama B.', 'Bush G.', 'Clinton B.',];
echo $names[0], $names[1], $names[2], $names[3];

Cần lưu ý đối với mảng chỉ số, mặc định phần tử đầu tiên của mảng có chỉ số 0, phần tử cuối cùng có chỉ số n – 1 (với n là số lượng phần tử của mảng).

Tuy nhiên, đối với mảng mà bạn chủ động chỉ định chỉ số thì các phần tử sẽ không có chỉ số như mặc định nữa. Ví dụ:

$days = [2=> 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
echo $days[2], ' ', $days[8]; // in ra 'Monday' 'Sunday'

Đây là tình huống rất dễ gây ra nhầm lẫn.

Ở đây bạn chủ động tạo chỉ số 2 cho phần tử đầu tiên, dẫn đến các phần tử còn lại có chỉ số từ 3 đến 8. Do vậy bạn phải dùng chỉ chỉ số từ 2 đến 8 để truy xuất các phần tử của mảng này.

Truy xuất mảng kết hợp

Đối với mảng kết hợp, bạn truy xuất phần tử qua khóa như sau:

$book2 = array(
    'title' => 'PHP programming for expert',
    'authors' => 'Obama B.',
    'publisher' => 'The White house',
    'year' => 2013,
);
$title = $book2['title'];
$authors = $book2['authors'];
$year = $book2['year'];
$publisher = $book2['publisher'];

Truy xuất mảng của mảng

Đối với mảng của mảng, bạn cần ghép các phép toán truy xuất phần tử. Hãy xem ví dụ sau:

$books = array(
    [ # mỗi phần tử là một cuốn sách
        'title' => 'PHP programming for dummy',
        'authors' => 'Trump D.',
        'publisher' => 'The White house',
        'year' => 2017,
    ],
    [
        'title' => 'PHP programming for expert',
        'authors' => 'Obama B.',
        'publisher' => 'The White house',
        'year' => 2013,
    ],
);
$book0 = $books[0]; // truy xuất phần tử đầu tiên ($book0 cũng là một mảng)
$book0_title = $books[0]['title']; // tương đương với $book0['title']
$book0_authors = $books[0]['authors']; // tương đương với $book0['authors']

Do $books là một mảng của mảng, việc truy xuất cũng diễn ra ở 2 mức độ:

  1. $book0 = $books[0] là cách truy xuất các phần tử của mảng chỉ số $books như bạn đã biết.
  2. Do $book0 cũng là một mảng, nếu cần lấy giá trị title của $book0, bạn cần viết $book0_title = $book0['title'], giống như với mảng kết hợp bạn đã biết.

Do $book0 = $books[0], bạn có thể viết kết hợp hai phép toán truy xuất để trực tiếp lấy giá trị title của cuốn sách đầu tiên: $book0_title = $books[0]['title'];

Đối với cấu trúc ma trận, việc truy xuất như sau:

$matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
];
$row0 = $matrix[0];
$element_00 = $matrix[0][0]; // $row0[0]

Kết luận

Trong bài học này chúng ta đã làm quen với khái niệm mảng trong PHP:

  • Mảng trong PHP thực tế có thể xem là kiểu dữ liệu từ điển, với mỗi phần tử được biểu diễn bằng một cặp khóa => giá_trị.
  • Tùy thuộc vào cách tạo khóa, mảng trong PHP phân biệt làm mảng chỉ số và mảng kết hợp.
  • Mỗi phần tử có thể nhận giá trị thuộc bất kỳ kiều nào, kể cả mảng khác.
  • Khóa có thể là số nguyên hoặc chuỗi – hai kiểu dữ liệu có thể so sánh.
  • Có thể tạo ra mảng của mảng để mô phỏng các cấu trúc dữ liệu phức tạp.
  • Có thể tạo mảng qua array() function hoặc array literal [].
  • Có thể truy xuất phần tử qua phép toán [chỉ số | khóa].

+ Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
+ Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
+ Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
Cảm ơn bạn!