PDA

View Full Version : [TUTOR] Mảng và thao tác với mảng trong PHP - Bài 1



Little James
24-10-2002, 10:31
Bài 1. Mảng.
(Từ PHP MySQL)

I. Mảng là gì?

Mảng để lưu trữ bộ các giá trị, bằng cách ấy cho phép bạn nhóm các biến vô hướng lại.
Sau khi chúng ta có mảng, chúng ta có thể làm nhiều thứ hữu ích với nó. Ví dụ như sort(),...
Các giá trị lưu trữ trong một mảng gọi là các phần tử. Mỗi phần tử mảng có một index kết hợp (hay key) được sử dụng để truy nhập phần tử mảng.
Mảng trong phần lớn các ngôn ngữ lập trình có các chỉ số bắt đầu từ 0 hay 1. PHP cũng như vậy.
PHP còn cung cấp mảng kết hợp, mảng kết hợp có thể có mọi thứ giống mảng chỉ số, nhưng thường sử dụng chuỗi.

II. Mảng chỉ số.

1. Khởi tạo các mảng chỉ số.
Ví dụ tạo mảng tên là products, bao gồm ba phần tử:
$products = array("Tires","Oil","Spark Plugs");
Chú ý rằng, như echo, array() là một cấu trúc ngôn ngữ, không phải là hàm.
Tuỳ thuộc vào nội dung bạn cần trong array, bạn có thể không cần thao tác khởi tạo chúng như ví dụ trước.
Nếu bạn cần có dữ liệu trong một mảng khác, bạn có thể copy một mảng vào mảng khác sử dụng toán tử =.
Nếu bạn muốn tăng tuần tự các số lưu trữ trong mảng bạn có thể sử dụng hàm range() để tự động tạo mảng. Ví dụ sau tạo một mảng numbers với các phần tử trong phạm vi từ 1 đến 10:
$numbers = range(1,10);
Nếu bạn có thông tin lưu trữ trong một file, bạn có thể load nội dung mảng trực tiếp từ file.
Bạn còn có thể sử dụng các hàm khác nhau để trích một phần mảng hay đảo lại trật tự một mảng.

2. Truy nhập nội dung mảng.

Để truy nhập nội dung của biến sử dụng tên của nó. Nếu là mảng, truy nhập nội dung sử dụng tên mảng và key hay index. key hay index cho biết giá trị lưu trữ nào mà chúng ta truy nhập. Ví dụ:

$products[0], $products[1].
Như với các biến khác, nội dung các phần tử mảng được thay đổi bằng toán tử =. Ví dụ:

$products[0] = "Fuses";
Ví dụ sau có thể dùng để thêm một phần tử mới (mảng đã có 3 phần tử):

$products[3] = "Fuses";
Để hiển thị nội dung của mảng:

echo "$product[0] $products[1] $products[2] $products[3]";
Như các biến PHP khác, mảng không cần khởi tạo trước. Chúng được tự động tạo khi sử dụng lần đầu. Ví dụ để tạo mảng products:


$products[0] = "Tires";
$products[1] = "Oil";
$products[2] = "Spark Plugs";
Nếu $products chưa tồn tại, dòng đầu tiên sẽ tạo một mảng với một phần tử, sau đó thêm các giá trị vào mảng.

3. Sử dụng vòng lặp để truy nhập mảng.

Vì mảng được index bởi thứ tự các số, nên chúng ta có thể sử dụng vòng lặp for để hiển thị nội dung mảng dễ dàng hơn:


for($i=0;$i<3;$i++)
echo "$products[$i];

Khả năng sử dụng vòng lặp đơn giản để truy nhập phần tử mảng là một đặc điểm hay của mảng chỉ số. Các mảng kết hợp không dễ lặp, nhưng cho phép các chỉ số có ý nghĩa hơn.

III. Mảng kết hợp (còn có tên mảng băm).

Trong mảng products ở trên, chúng ta cho phép PHP đưa mỗi item một chỉ số mặc định. PHP còn cung cấp mảng kết hợp.

1. Khởi tạo mảng kết hợp
[/code]
$prices = array("Tires"=>100, "Oil"=>10, "Spark Plugs"=>4);
[/code]
2. Truy nhập phần tử mảng kết hợp

$prices["Tires"];
Cũng như mảng chỉ số, mảng kết hợp có thể được tạo và khởi tạo một phần tử cùng lúc.
Đoạn mã sau tạo mảng $prices, tạo một phần tử sau đó thêm 2 phần tử:


$prices = array("Tires"=>100);
$prices["Oil"] = 10;
$prices["Spark Plugs"] = 4;

Sau đây là một ví dụ khác. Trong đó chúng ta không tạo tường minh một mảng. Mảng được tạo khi chúng ta tạo phần tử đầu:

$prices["Tires"] = 100;
$prices["Oil"] = 10;
$prices["Spark Plugs"] = 4;

3. Sử dụng vòng lặp với each() và list()

Vì chỉ số trong mảng kết hợp không phải là số, chúng ta không thể sử dụng bộ đếm trong vòng lặp for để làm việc với mảng. Đoạn mã sau liệt kê nội dung mảng $prices:


while($element = each($prices))
{
echo $element["key"];
echo " - ";
echo $element["value"];
echo "<br>";
}

Kết quả:
Tires - 100
Oil - 10
Spark Plugs - 4
Hàm each() trả về phần tử hiện hành trong mảng và làm cho phần tử tiếp theo là phần tử hiện hành. Vì chúng ta đang gọi hàm each() trong vòng lặp while, nó sẽ trả về mọi phần tử trong mảng quay vòng và dừng lại khi kết thúc mảng.
Trong đoạn mã này, $element là một mảng. Khi chúng ta gọi hàm each(), nó cho chúng ta một mảng 3 giá trị và 3 chỉ số chỉ tới các vị trí mảng. Vị trí "key" và "0" chứa key của phần tử hiện hành, vị trí "value" và "1" chứa value của phần tử hiện hành. Nhưng chúng ta thường hay sử dụng tên vị trí, hơn là dùng các number.
Có một cách hay hơn để làm việc đó. Hàm list() có thể được sử dụng để chia một mảng thành một số giá trị. Chúng ta có thể chia hai giá trị mà hàm each() đưa ra như sau:

list($product,$price) = each($prices);
Lệnh trên sử dụng each() để lấy phần tử hiện hành từ $prices, trả về mảng và làm phần tử sau thành phần tử hiện hành. Sử dụng list() để đưa các phần tử 0 và 1 từ mảng trả về bởi each() vào các biến mới là $product và $price.
Chúng ta có thể lặp qua mảng $price, đưa ra nội dung như sau:


while( list( $product, $price) = each( $prices))
echo "$product - $price<br>";
Một điều chú ý khi sử dụng each() là nếu chúng ta muốn sử dụng mảng hai lần trong cùng một script, chúng ta cần đặt phần tử hiện hành trở lại đầu của mảng sử dụng hàm reset(). Do khi kết thúc each() sẽ trỏ đến phần tử cuối cùng của mảng. Để lặp lại mảng $prices, làm như sau:


reset($prices);
while( list($product,$price)=each($prices))
echo "$product - $price<br>";

IV. Mảng nhiều chiều

Các mảng không chỉ đơn giản là danh sách các key và value - mỗi vị trí trong mảng có thể lưu giữ mảng khác. Bằng cách này chúng ta có thể tạo mảng 2 chiều.
Nếu chúng ta muốn lưu trữ nhiều hơn một piece dữ liệu về mỗi sản phẩm , chúng ta có thể sử dụng mảng hai chiều.
Ví dụ sau mô tả các sản phẩm như là các mảng 2 chiều với mỗi hàng mô tả một sản phẩm riêng và mỗi cột mô tả một thuộc tính sản phẩm.
Code Description Price
TIR Tires 100
OIL Oil 10
SPK Spark Plugs 4
Sử dụng PHP, chúng ta sẽ viết mã sau để cài dữ liệu vào mảng đó:


$products = array( array("TIR","Tires",100),
array("OIL","Oil",10),
array("SPK","Spark Plugs",4)
);

Để truy nhập dữ liệu trong mảng hai chiều tương tự mảng một chiều, chỉ khác là mỗi phần tử của mảng có hai chỉ số - hàng và cột.
Để hiển thị nội dung của mảng này, chúng ta truy nhập mỗi phần tử theo thứ tự như sau:
[/code]
echo "|".$products[0][0]."|".$products[0][1]."|".$products[0][2]."|<br>";
echo "|".$products[1][0]."|".$products[1][1]."|".$products[1][2]."|<br>";
echo "|".$products[2][0]."|".$products[2][1]."|".$products[2][2]."|<br>";
[/code]
Cách khác chúng ta có thể dùng for để nhận cùng kết quả:


for($row=0;$row<3;$row++)
{
for($column=0;$column<3;$column++)
{
echo "|".$products[$row][$column];
}
echo "|<br>";
}

Kết quả:
|TIR|Tires|100|
|OIL|Oil|10|
|SPK|Spark Plugs|4|
Có thể bạn thích tạo các tên cột hơn là dùng các số. Để làm việc này, bạn có thể sử dụng các mảng kết hợp. Để lưu trữ cùng bộ products, với các cột có tên, bạn sẽ dùng mã sau:


$products = array(array"Code"=>"TIR","Description"=>"Tires","Price"=>100),
array("Code"=>"OIL","Description"=>"Oil","Price"=>10),
array("Code"=>"SPK","Description"=>"Spark Plugs","Price"=>4)
);

Mảng này dễ dàng làm việc với, nếu bạn muốn nhận một giá trị đơn. Sự mô tả được chứa trong cột Description dễ nhớ hơn là nhớ nó được chứa trong cột 1. Sử dụng các mảng kết hợp bạn không cần phải nhớ một mục được chứa tại [x] [y]. Bạn có thể dễ dàng tìm dữ liệu của bạn bằng cách tham chiếu tới vị trí với tên hàng và cột có ý nghĩa hơn.
Đây là một cách để hiển thị nội dung mảng:


for($row=0;$row<3;$row++)
{
echo "|".$products[$row]["Code"]."|".$products[$row] ["Description"]. "|".$products[$row] ["Price"]."|<br>";
}

Dùng for, chúng ta có thể duyệt mảng $products chỉ số. Mỗi hàng trong mảng $products bây giờ là một mảng kết hợp. Sử dụng each() và list() trong vòng lặp while, chúng ta có thể duyệt qua các phần tử mảng. Vì vậy phải dùng while bên trong for:
[/code]
for($row=0;$row<3;$row++)
{
while(list($key,$value)=each($products[$row]))
{
echo "|$value";
}
echo "|<br>";
}
[/code]

ithuyloi
21-05-2011, 14:55
Viết tut gì có 1 bài 1 xong lặng mất tiêu rồi há :D

ngoc_viet08
22-05-2011, 06:06
đào mộ siêu cấp , bớt rãnh đi nha

shuichi_akai7589
10-08-2011, 14:27
Gúc Search ra topic này. Tiện các cao nhân cho em hỏi, em có n mảng(=13) 1 chiều, em dùng hàm array_intersect để tìm giao của chúng. Có 1 vấn đề sảy ra là mảng kq thì chỉ số nó sẽ ko chạy từ 0,1,2.... mà là theo chỉ số của mảng cuối cùng (trong 13 mảng) mà có phần tử là giao nhau.
Làm như cũ thì có cách nào biết chỉ số ấy không ạ?
Và có cách nào để đánh dấu chỉ số từ 0,1,2,3... không ạ.
Em cám ơn trước.

toinayangi
11-08-2011, 11:22
bạn ơi còn bài nào không poss lên cho mình với mình đang cân mà không biết kiếm đâu ra cả chán thế