Vòng lặp Php (Bài trước)
(Bài tiếp) Chuỗi ký tự

Khái niệm mảng trong Php

Mảng Array là một loại biến đặc biệt, trong nó giữ nhiều giá trị. Mỗi giá trị trong mảng được gọi là phần tử của mảng, các phần tử trong mảng được truy xuất thông qua tên biến và ký hiệu [index], trong đó index được gọi là chỉ số của phần tử, chỉ số này có thể là một số nguyên hay là một chuỗi ... tùy thuộc vào loại mảng mà bạn khởi tạo ở phần sau.

Khi mảng không có phần tử nào được gọi là mảng rỗng, bạn có thể tạo ra một biến mảng rỗng để sau này thêm các phần tử vào, cú pháp như sau:

$mang1 = array();   // tạo một mảng rỗng
$mang2 = [];        // tạo một mảng rỗng - cú pháp này dễ đọc hơn.

Mảng PHP cơ bản

Mảng chỉ số là số - Numeric Array

Mảng dạng số là mảng mà mỗi phần tử của nó có một chỉ số là số nguyên. Một biến mảng dạng này chỉ số sẽ gán một cách tự động và bắt đầu từ chỉ số là số 0 khi phần tử đầu tiên được thêm vào, cứ thế phần tử thứ 2 thêm vào mảng sẽ có chỉ số là 1:

Nhớ là chỉ số của mảng bao giờ cũng bắt đầu từ 0 chứ không phải 1

Khởi tạo mảng và đưa phần tử vào mảng: giá sử khởi tạo mảng lưu danh sách tên khách hàng

<?php
    $names = ["An", "Minh", "Long"];    // khởi tạo mảng $name, đưa vào nó 3 phần tử
    var_export($names);                 // export biến mảng

Chạy thử, kết quả export của biến $names

array (
  0 => 'An',
  1 => 'Minh',
  2 => 'Long',
)

Như vậy phần tử có chỉ số 0 thì giá trị là 'An', chỉ số 1 giá trị là 'Minh' ... chỉ số này dùng với ký hiệu $tên-biến[chỉ-số] để truy xuất (đọc hoặc gán) phần tử mảng:

$ten      =  $names[2];             // Long
$names[1] = 'Nguyên';               // phần  tử chỉ số 1 gán giá trị  mới

Thêm phần tử vào mảng bạn có thể đưa các phần tử vào mảng bằng cách viết

$bienmang[index] = $giatri;          // thêm vào phần tử với chỉ số index, phần tử nếu là mới
                                     // thêm sẽ nằm cuối, dù giá trị index bao nhiêu

$bienmang[] = $giatri;               // thêm vào cuối phần tử mới, chỉ số phần tử này bằng chỉ số lớn nhất cộng 1
                                     // nếu đây là phần tử đầu tiên của mảng thì chỉ số sẽ là 0

Nhớ là các chỉ số phải là số nguyên, mỗi biến mảng sẽ lưu một giá trị để đánh chỉ số, giá trị này luôn bằng chỉ số lớn nhất của index số nguyên thêm vào, nếu thêm phần tử bằng []= thì giá trị này sẽ tăng thêm 1, nếu thêm bằng [index]= giá trị này sẽ bằng index nếu index là lớn nhất so với các index có sẵn trong mảng. Hãy xem ví dụ sau, tạo biến mảng chỉ thêm các phần tử:

<?php
    unset($names);       // hủy biến nếu biến đang có để khởi tạo từ đầu

    $names[20] = "A";
    $names[2]  = "B";
    $names[1]  = "C";

    var_export($names); 
    /*
        array (
            20 => 'A',
            1 => 'B',
            2 => 'C',
        )
    */
    $names[] = "D";     //thêm vào cuối
    var_export($names); 
    /*
    array (
        20 => 'A',
        2 => 'B',
        1 => 'C',
        21 => 'D',
    )*/

Từ ví dụ trên bạn thấy, chỉ số index không phải là thứ tự sắp xếp các phần tử trong mảng. Chỉ số không liên quan đến số lượng phần tử trong mảng (nhiều người nhầm lẫn). Ví dụ mảng trên, có phần 4 phần tử, nhưng chỉ số đã nhảy đến 21. Tuy nhiên nếu mảng chỉ thêm vào bằng cách [] và các phần tử không bị xóa (unset), thì có sự liên quan.

Các phần tử của mảng này (giá trị) có thể lưu trữ bất kỳ loại biến nào, có thể là chuỗi, số nguyên, một mảng khác, boolean ... Ví dụ:

$arrayData[0] = '<strong>Mèo</strong>';
$arrayData[1] = '4';
$arrayData[2] = 'chân';
echo "$arrayData[0] có $arrayData[1] $arrayData[2]";
// In ra:
// Mèo có 4 chân

Vòng lặp duyệt qua các phần tử mảng

Cách phổ biến nhất là dùng lệnh foreach, có hai trường hợp mỗi lần lặp trích xuất ra giá trị phần tử và trích xuất cả giá trị và chỉ số index

// vòng lặp, lấy giá trị từng phần tử
foreach ($bienmang as $value) {
    var_dump($value);
}

// vòng lặp, lấy  giá trị  và chỉ số từng phần tử
foreach ($bienmang as $key => $value) {
    var_dump($key, $value);
}

Ví dụ:

<?php
    $names = ["An", "Minh", "Nguyên"];
    foreach ($names as $k => $name)
    {
        echo "chỉ số $k; giá trị $name", PHP_EOL;
    }
    /*
        chỉ số 0; giá trị An
        chỉ số 1; giá trị Minh
        chỉ số 2; giá trị Nguyên
    */
    foreach ($names as $name)
    {
        echo "$name ";
    }
    //An Minh Nguyên 

Số phần tử (kích thước) trong mảng, kiểm tra là biến mảng

Hàm is_array($bien) kiểm tra xem $bien có phải là mảng. count($bienmang) trả vế số lượng phần tử trong mảng. Nếu mảng số - khởi tạo bằng cách liệt kê các giá trị - thì chỉ số và số phần tử có sự liên hệ, nên trường hợp này duyệt được bằng vòng lặp for

$names = ["An", "Minh", "Nguyên"];  // mảng số theo thứ tự

$leng = count($names);
echo "Số phần tử là: " . $leng, PHP_EOL;

// Lặp từ phần tử cuối lên đầu
for ($i = $leng -1; $i >= 0; $i--)
{
    echo $names[$i], ' ';
}
/*
    Số phần tử là: 3
    Nguyên Minh An
*/

Mảng kết hợp - Associative Arrays

Mảnh kết hợp này thì tên chỉ số là một giá trị nào đó do bạn gán vào, có thể là một string hay một số ...
Cũng có hai cách khởi tạo mảng này, ví dụ:

<?php
    $ngay_thu  =  [
        'Mon' => "Thứ Hai",
        'Tue' => "Thứ Ba",
        'Wed' => "Thứ Tư",
        'Thu' => "Thứ Năm"
    ];
    foreach ($ngay_thu as $k => $v)
        echo "$k ($v)", PHP_EOL; 
    /*
    Mon (Thứ Hai)
    Tue (Thứ Ba)
    Wed (Thứ Tư)
    Thu (Thứ Năm)*/

Ở ví dụ trên chỉ số không còn là số nữa mà là các chuỗi Mon, Tue ... tương ứng với chỉ số này là giá trị Thứ hai, Thứ ba. Truy cập đến phần tử chuỗi vẫn dùng ký hiệu $bien[index] trong đó index là chỉ số (có thể là chuỗi hay số tùy vào kiểu index cho phần tử đó)

echo $ngay_thu['Wed'];

//Sẽ in ra : Thứ 4

Mảng nhiều chiều - Multidimensional Array

Mảng nhiều chiều là mảng trong nó chứa một hay nhiều mảng khác (có nghĩa là phần tử của mảng có giá trị là một mảng khác). Số chiều của mảng tương ứng với cặp [] để chọn phần tử mảng.
- Mảng một chiều: [chỉ-số]
- Mảng hai chiều: [chỉ-số-1][chỉ-số-2]
- Mảng ba chiều: [chỉ-số-1][chỉ-số-2][chỉ-số-3]

Mảng rất tiện dụng và mạnh mẽ, nhưng các mảng có hơn ba chiều, quản lý nó khá phức tạp. Vậy đừng lạm dụng mảng hơn ba chiều

Ví dụ dưới đây là mảng hai chiều:

<?php
    $diem = [
        'Hùng' => [
            'Toán' => 8,
            'Lý' => 7,
            'Hóa'  => 9
        ],
        'Huy' => [
            'Toán' => 7,
            'Lý' => 8,
            'Hóa'  => 8
        ],
        'Hưng' => [
            'Toán' => 9,
            'Lý' => 9,
            'Hóa'  => 9
        ],
    ];

    foreach ($diem as $ten => $cacdiem) {
        echo $ten, PHP_EOL;
        foreach ($cacdiem as $monhoc => $d)
            echo "  $monhoc: $d", PHP_EOL;

    }
      
// In ra
/*
    Hùng
      Toán: 8
      Lý: 7
      Hóa: 9
    Huy
      Toán: 7
      Lý: 8
      Hóa: 8
    Hưng
      Toán: 9
      Lý: 9
      Hóa: 9 */

Lấy điểm môn hóa của Huy

echo $diem['Huy']['Hóa'];  // 8

Một số hàm xử lý mảng

Hàm Mô tả
array_change_key_case() Trả về một mảng mà các key chuyển thành chữ thường
$ar1 = ["A" => 1, 'b' => 2];
$ar2 = array_change_key_case($ar1);  //["a" => 1, 'b' => 2]
array_combine() Tạo một mảng bởi sử dụng một mảng cho key và mảng khác cho value
$ar_ho  = ["Nguyễn", "Đinh", "Phạm"];
$ar_ten  = ["Văn A", "Thị B", "Văn Bách"];

$hovaten = array_combine($ar_ho, $ar_ten);
var_export($hovaten); 
/*array (
'Nguyễn' => 'Văn A',
'Đinh' => 'Thị B',
'Phạm' => 'Văn Bách',)*/
array_count_values() Trả về một mảng, index là giá trị, giá trị đó xuất hiện bao nhiêu lần
$a = [6,6,2,3,4,4];
$b = array_count_values($a);
print_r($b);/*
Array
(
    [6] => 2    // 6 xất  hiện  2 lần
    [2] => 1
    [3] => 1
    [4] => 2
)
array_filter() Trả về mảng, lọc các phần tử bởi hàm callback. Ví dụ, lấy mảng con gồm các phần tử >=6.
$a = [2,6,7,5,1];
$callback = function($value) {
    return $value >= 6;   // true nếu giá trị phần tử >=6
};

$b = array_filter($a, $callback); // lọc theo callback
print_r($b);

/*
Array
(
    [1] => 6
    [2] => 7
)
*/

                
array_key_exists() Kiểm tra index $key có tồn tại (trả về true) trong mảng $a array_key_exists($key, $a)
array_keys() Trả về mảng chứa các key của mảng gốc
array_merge() Gộp hai mảng thành một mảng mới (giá trị)
$a = [3,4];
$b = [1,2];
$c = array_merge($a, $b);
print_r($c);
Array
(
    [0] => 3
    [1] => 4
    [2] => 1
    [3] => 2
)
array_pop($ar) Xóa phần tử cuối và trả về giá trị của phần tử đó
array_product() Tính toán tích số của mảng (mảng rỗng tích số là 1)
array_push() Chèn một hoặc nhiều phần tử vào phần cuối của một mảng
array_reduce() Suy biến mảng thành một giá trị biến đơn biến này đầu tiên khởi tạo null, nó thực hiện bằng cách chuyển từng phần tử và giá trị biến đơn cho 1 hàm callback (hàm callback có 2 tham số), hàm callback xử lý và trả về giá trị - giá trị này gán vào biến đơn, cứ thế cho hết các phần tử. Ví dụ, chuyển mảng thành chuỗi thông báo, liệt kê các phần tử lớn hơn 4
$a = [1,2,3,4,5,6,7,8];
$fun = function($ketqua, $phantu) {
    if ($ketqua === null) $ketqua = "Số chẵn lớn hơn 4 là: ";
    if ($phantu % 2 == 0) $ketqua .= " $phantu";
    return $ketqua;
} ;
$c = array_reduce($a, $fun);
echo PHP_EOL, $c, PHP_EOL;
// Số chẵn lớn hơn 4 là:  2 4 6 8
array_reverse() Trả về một mảng với thứ tự bị đảo ngược
array_search() Tìm kiếm theo giá trị phần tử, trả về mảng chứa kết quả tìm kiếm
array_shift() Xóa bỏ phần tử đầu tiên khỏi mảng, trả về giá trị phần tử đó
array_sum() Trả về tổng các giá trị phần tử trong một mảng
array_unique() Tạo một mảng mới từ mảng gốc, đảm bảo mỗi phần tử của mảng là khác nhau (những phần tử mảng gốc có giá trị giống nhau thì chỉ sao chép một lần)
array_values() Trả về mảng numberic, chứa các giá trị
in_array() Kiểm tra xem một giá trị có trong phần tử mảng
shuffle() Làm lộn xộn ngẫu nhiên thứ tự các phần tử trong mảng
sort() Sắp xếp một mảng

Đăng ký nhận bài viết mới
Vòng lặp Php (Bài trước)
(Bài tiếp) Chuỗi ký tự